【问题标题】: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有没有可能无意中挡道?

【问题讨论】:

    标签: c++ c++11 initializer-list type-narrowing


    【解决方案1】:

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

    【讨论】:

    • 这是一条线索。好的。 Bjarne 在他的书中说这是一个错误。
    • @softwarelover 好吧,编译器并不完美。他们中的大多数都有各种不合格的特征。
    • @softwarelover:标准没有“警告”和“错误”的概念。所需要的只是此类代码“格式错误”并发出诊断信息(又名:消息)。编译器仍然可以继续编译它认为合适的代码;是否这样做完全取决于编译器。
    • 如何反其道而行之:在 clang 中将错误变成警告?
    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多