c++ - 为什么编译器允许缩小转换

标签 c++ c++11

谁能给我解释一下,如果初始化器可能导致信息丢失,为什么编译器允许初始化内置类型的变量?

例如 C++ Primer,第 5 版说,如果初始化器可能导致信息丢失,编译器不会让我们列出内置类型的初始化变量。

但是我的编译器 gcc v 4.7.1 在以下代码中成功初始化了变量 a:

long double ld = 3.1415926536; 
int a{ld};

只是警告:在 { } [-Wnarrowing] 中缩小从“long double”到“int”的“ld”转换。

最佳答案

初始化列表的一个特点是不允许缩小转换。但是语言定义不区分警告和错误;当代码格式错误时,它需要“诊断”,它被定义为一组实现定义的消息中的任何消息。警告满足此要求。这是非标准扩展的机制:发出警告后,编译器可以自由地做任何它想做的事情,包括根据特定于实现的规则编译一些东西。

关于c++ - 为什么编译器允许缩小转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873919/

相关文章:

c++ - 模板函数实例化的可移植性问题

c++ - 如何用父类型的智能指针调用子类的析构函数?

c++ - 为什么 `operator<<` 的 `basic_ostream` 的右值重载会返回左值引用?

c++ - 编译错误 C3861 Visual Studio 2010

c++ - 使用智能指针将右值引用绑定(bind)到抽象类的替代方法

c++ - GCC constexpr 允许添加,但不允许使用地址进行按位或

C++ 构造函数 : why is this virtual function call not safe?

c++ - find() 返回 unsigned int 的最大值

使用现代编译器编译的 C++ 项目,但链接到过时的 libstdc++

c++ - 是否有安全的方法来断言字符串 View 是否以 null 终止?