从nullptr_t转换为bool:有效与否?

sve*_*ven 8 c++ compiler-errors type-conversion language-lawyer c++11

我用3个编译器测试了以下代码,得到了3个不同的结果:错误,警告和确定.

  • GCC(5.3):错误:从'std :: nullptr_t'到'const Thing&'的用户定义转换无效
  • Clang(3.8):警告:将nullptr常量隐式转换为'bool'
  • MSVC(14.1):没有错误,没有警告

哪个编译器正确?我知道这是指针类型和bool.之间的微不足道的转换.但那是什么std::nullptr_tbool

(最后,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)

son*_*yao 8

这是无效的.根据布尔转换规则:

类型的prvalue std::nullptr_t,包括nullptr,可以bool在直接初始化的上下文中转换为类型的prvalue .结果值是false.

标准的引用,§7.14/ 1布尔转换[conv.bool]

对于直接初始化,std?::?nullptr_­t可以将类型的prvalue转换为类型的prvalue bool; 结果值是false.

转换仅允许直接初始化,但不允许复制初始化,其中包括通过值将参数传递给函数的情况.例如

bool b1 = nullptr; // invalid
bool b2 {nullptr}; // valid
Run Code Online (Sandbox Code Playgroud)

所以GCC是正确的.但是Clang也没错; 标准只要求编译器在程序格式错误时"发出诊断",因此它必须告诉您发生的事情,之后它可以做任何事情.

请参阅C++标准是否指定在某些情况下编译失败并出现错误?