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

时间:2017-05-05 11:05:12

标签: c++ c++11 compiler-errors type-conversion language-lawyer

我用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
}

1 个答案:

答案 0 :(得分:8)

这是无效的。根据{{​​3}}的规则:

  

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

标准引用boolean conversions

  

对于直接初始化,可以将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也没错;标准只要求编译器发出诊断信息"当程序形成不良时,它必须告诉你发生的事情,之后它可以做任何事情。

请参阅copy-intialization