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标志,因此没有任何警告或错误。这样做之后,我得到了预期的结果。