sve*_*ven 8 c++ compiler-errors type-conversion language-lawyer c++11
我用3个编译器测试了以下代码,得到了3个不同的结果:错误,警告和确定.
哪个编译器正确?我知道这是指针类型和bool.之间的微不足道的转换.但那是什么std::nullptr_t和bool?
(最后,Clang和MSVC对代码都很好.Clang以积极的方式更加冗长.)
struct Thing
{
Thing(bool) {}
};
void addThing(const Thing&){}
int main()
{
addThing(nullptr); // warning or error on this line
}
Run Code Online (Sandbox Code Playgroud)
这是无效的.根据布尔转换规则:
类型的prvalue
std::nullptr_t,包括nullptr,可以bool在直接初始化的上下文中转换为类型的prvalue .结果值是false.
标准的引用,§7.14/ 1布尔转换[conv.bool]
对于直接初始化,
std?::?nullptr_t可以将类型的prvalue转换为类型的prvaluebool; 结果值是false.
转换仅允许直接初始化,但不允许复制初始化,其中包括通过值将参数传递给函数的情况.例如
bool b1 = nullptr; // invalid
bool b2 {nullptr}; // valid
Run Code Online (Sandbox Code Playgroud)
所以GCC是正确的.但是Clang也没错; 标准只要求编译器在程序格式错误时"发出诊断",因此它必须告诉您发生的事情,之后它可以做任何事情.
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |