为什么" bool c = nullptr;"编译(C ++ 11)?

时间:2014-02-25 11:30:33

标签: c++ pointers c++11 null-pointer

我不明白为什么要关注代码compiles

int main()
{
     //int a = nullptr;  // Doesn't Compile
     //char b = nullptr; // Doesn't Compile
       bool c = nullptr; // Compiles

       return 0;
}

而评论部分没有。


我已经完成thisthis

boolnullptr都是关键字,那么其他数据类型的独特之处是什么?

4 个答案:

答案 0 :(得分:40)

出于与

相同的原因
if( p ) { ... }

编译:基本类型的任何值都隐式转换为布尔值,0转换为false,任何其他值转换为true

最初基本类型值必须转换为bool才能实现C兼容性。 C最初没有bool类型,但任何数值表达式都可以用作布尔值(使用0 == false约定)。而现在我们陷入了向后兼容的纠结。 nullptr必须支持if(p)等惯用结构,尤其是旧代码的文字0NULL替换为nullptr的情况。例如。类似if(p)的代码可以来自宏扩展或模板代码。


附录nullptr未转换为例如<* 1}}的技术 int

由于nullptr隐式转换为boolbool(不幸的是)隐式转换为int,因此可以预期nullptr也应转换为{ {1}}。但int的要点是它应该表现为指针值。虽然指针确实隐式转换为nullptr,但它们不会隐式转换为数字类型。

为用户定义的类型安排这样的限制并不完全是直截了当的。如果存在,则会调用bool转换以转换为operator bool。限制之一的一个C ++ 11解决方案是使转换运算符成为模板,受int限制,如下所示:

std::enable_if

答案 1 :(得分:19)

  

C ++11§4.12布尔转换

     

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。零值,空指针值或空成员指针值转换为false;任何其他值都将转换为true。类型std::nullptr_t的prvalue可以转换为bool类型的prvalue;结果值为false

nullptr确实是一个关键字,但它是一个空指针文字,与bool的角色不同。考虑一下布尔文字,truefalse也是关键字。

答案 2 :(得分:5)

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#654中,Jason Merril认为

  

我们可以用任意指针做任何事情,我们也应该能够使用nullptr_t。

我认为以下(稍微假设的)示例支持该参数(尽管我不完全确定它是否适用于此情况)

template<typename T, typename P>
void safeProcess(T pointer, P &processor) {
  bool isNonNull(pointer);
  if(isNonNull) {
    processor.process(pointer);
  }
}

允许传递nullptr以及与processor.process接受的任何内容兼容的其他指针类型。

答案 3 :(得分:0)

C ++ 11通过引入一个new关键字作为一个区分空指针常量来解决这个问题:nullptr。它的类型为nullptr_t,它是可隐式转换的,可与任何指针类型或指向成员类型的类型相媲美。除了bool之外,它不可隐式转换或与整数类型相比。虽然最初的提案指定类型为nullptr的rvalue不能转换为bool,但核心语言工作组决定这样的转换是可取的,以便与常规指针类型保持一致。拟议的措辞变更于2008年6月一致投票通过了工作文件。[2]

出于向后兼容性原因,0仍然是有效的空指针常量。

char *pc = nullptr;     // OK
int  *pi = nullptr;     // OK
bool   b = nullptr;     // OK. b is false.
int    i = nullptr;     // error