C++ C+中的统一初始化+;14双指定给浮点变量不会产生缩小误差
根据我对统一初始化的理解,以下代码应该会产生一个缩小的错误,但它不会:C++ C+中的统一初始化+;14双指定给浮点变量不会产生缩小误差,c++,initialization,c++14,C++,Initialization,C++14,根据我对统一初始化的理解,以下代码应该会产生一个缩小的错误,但它不会: #include<iostream> int main() { double d; float f = {d}; // should produce a narrowing error return 0; } #包括 int main(){ 双d; float f={d};//应产生缩小错误 返回0; } 我相信这是一个错误,因为编译器必须考虑D的所有可能值,换句话说,D可能持有的值的范围大
#include<iostream>
int main() {
double d;
float f = {d}; // should produce a narrowing error
return 0;
}
#包括
int main(){
双d;
float f={d};//应产生缩小错误
返回0;
}
我相信这是一个错误,因为编译器必须考虑D的所有可能值,换句话说,D可能持有的值的范围大于浮点可以容纳的值。 gcc版本4.9.3
使用
g++-std=c++11
,确实会发出警告,但是如果省略c++11编译器标志(使用g++4.9.2),则不会发出警告
使用
clang++-std=c++14-stdlib=libc++-Wall-pedantic-Wdeprecated-Wextra
这不会编译,但会给出一个缩小错误,而不仅仅是一个警告(使用clang++3.6.0)。发出诊断信号需要缩小转换。警告或错误满足了这一点
运行您的代码(GCC4.9.2,这是我可以链接到的最新版本)会发出警告
warning: narrowing conversion of 'd' from 'double' to 'float' inside { } [-Wnarrowing]
这符合本标准规定的要求
如果您确实需要错误,您可以始终使用
-Werror
或将所有警告视为错误的-pedantic errors
,将缩小转换视为错误。标准没有区分“错误”和“警告”。您的代码格式不正确,但标准规定:
N4140[简介合规性]/2.2:
如果程序违反了任何可诊断规则或出现了中所述的构造
当实现不支持该构造时,此标准被视为“有条件支持”,
一致性实施应发出至少一条诊断信息
[intro.compliance]/8:
一致性实现可能有扩展(包括附加的库函数),前提是它们有扩展
不改变任何格式良好的程序的行为。需要实现来诊断以下程序:
根据本国际标准,使用格式不正确的扩展。然而,在这样做之后,
他们可以编译和执行这样的程序
GCC对格式错误的代码发出诊断,因此它在这方面是兼容的。请注意,如果您从以下错误传递-pedantic errors
,它将发出错误:
本标准仅要求“符合要求的实施应
发出至少一条诊断消息“因此使用
警告是允许的。正如安德鲁所说,-Werror=缩小允许您
如果你愿意,就把它当作一个错误
标准几乎从不要求编译器将任何内容视为错误。@BoBTFish这不是真的,关于列表初始化的部分(
[dcl.init.list]/3
)概述了其他一些不允许缩小转换的地方。我编译时没有-std=c++14标志,因此没有任何警告或错误。这样做之后,我得到了预期的结果。