为啥初始化列表允许 C++ 中的类型缩小?

Posted

技术标签:

【中文标题】为啥初始化列表允许 C++ 中的类型缩小?【英文标题】:Why is the initializer list allowing type narrowing in C++?为什么初始化列表允许 C++ 中的类型缩小? 【发布时间】:2019-01-26 13:43:21 【问题描述】:

在使用 C++ 中的 初始化程序列表和原始类型时,我看到了两个不同的结果。

我只得到一个警告

中将 d 从 double 转换为 int
double d 3.0;
int integer d;

但是,如果我让它更明确,而不是警告,我会得到一个错误将“3.0e+0”从“double”缩小到“int”在

int integer 3.0;

如果使用 ,C++11 不应该在这两种情况下阻止任何缩小转换吗?那为什么只发生在一种情况下呢?

我正在使用最新版本的 Eclipse for C/C++ 和 MingGW。 C++14有没有可能无意中挡道?

【问题讨论】:

【参考方案1】:

对于 gcc 变体,您需要指定 -Werror=narrowing 以使其成为错误而不是警告。 clang 和 vc++ 比较严格,默认会报错。

【讨论】:

这是一条线索。好的。 Bjarne 在他的书中说这是一个错误。 @softwarelover 好吧,编译器并不完美。他们中的大多数都有各种不合格的特征。 @softwarelover:标准没有“警告”和“错误”的概念。所需要的只是此类代码“格式错误”并发出诊断信息(又名:消息)。编译器仍然可以继续编译它认为合适的代码;是否这样做完全取决于编译器。 如何反其道而行之:在 clang 中将错误变成警告?

以上是关于为啥初始化列表允许 C++ 中的类型缩小?的主要内容,如果未能解决你的问题,请参考以下文章

c++初始化函数列表

为啥 C++ 列表初始化也会考虑常规构造函数?

为啥 C++ 不能用“超类”类型的右值初始化“派生类”类型的变量?

为啥允许在这里用非 const 初始化静态变量?

C++ 中的***是啥?

C++关于初始化列表的细节(必须/不能使用初始化列表的情况初始化列表的效率分析)