我用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
}
答案 0 :(得分:8)
这是无效的。根据{{3}}的规则:
类型
std::nullptr_t
的prvalue(包括nullptr
)可以在直接初始化的上下文中转换为类型bool
的prvalue。结果值为false
。
对于直接初始化,可以将
std::nullptr_t
类型的prvalue转换为bool
类型的prvalue;结果值为false
。
转换仅允许§7.14/1 Boolean conversions [conv.bool],但不允许direct-initialization,其中包括通过值将参数传递给函数的情况。 e.g。
bool b1 = nullptr; // invalid
bool b2 {nullptr}; // valid
所以GCC是正确的。但是Clang也没错;标准只要求编译器发出诊断信息"当程序形成不良时,它必须告诉你发生的事情,之后它可以做任何事情。