从nullptr_t转换为bool:有效与否

conversion from nullptr_t to bool: valid or not?

本文关键字:有效 bool nullptr 转换      更新时间:2023-10-16

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

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

在包括nullptr在内的std::nullptr_t类型的prvalue可以在直接定位化的情况下转换为bool类型的prvalue。结果值是false

标准的引用,第7.14/1节布尔转换[CONC.BOOL]

为了直接启动,可以将std​::​nullptr_­t型的prvalue转换为bool类型的prvalue;结果值是false

仅允许转换进行直接限制,而不得进行复制纯化,其中包括将参数传递给函数按值的情况。例如

bool b1 = nullptr; // invalid
bool b2 {nullptr}; // valid

因此,GCC是正确的。但是clang也没有错。该标准仅要求编译器在程序不正确时"签发诊断",因此必须告诉您某些事情发生,之后它可以做任何事情。

请参阅C 标准是否指定在某些情况下,编译应在错误中失败?