我不明白为什么要关注代码compiles?
int main()
{
//int a = nullptr; // Doesn't Compile
//char b = nullptr; // Doesn't Compile
bool c = nullptr; // Compiles
return 0;
}
而评论部分没有。
bool
和nullptr
都是关键字,那么其他数据类型的独特之处是什么?
答案 0 :(得分:40)
出于与
相同的原因if( p ) { ... }
编译:基本类型的任何值都隐式转换为布尔值,0
转换为false
,任何其他值转换为true
。
最初基本类型值必须转换为bool
才能实现C兼容性。 C最初没有bool
类型,但任何数值表达式都可以用作布尔值(使用0 == false
约定)。而现在我们陷入了向后兼容的纠结。 nullptr
必须支持if(p)
等惯用结构,尤其是旧代码的文字0
或NULL
替换为nullptr
的情况。例如。类似if(p)
的代码可以来自宏扩展或模板代码。
附录:nullptr
未转换为例如<* 1}}的技术 int
。
由于nullptr
隐式转换为bool
,bool
(不幸的是)隐式转换为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
的角色不同。考虑一下布尔文字,true
和false
也是关键字。
答案 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