我看到nullptr
已在Visual Studio 2010中实现。我喜欢这个概念,并希望尽快开始使用它;但是GCC还不支持它。我的代码需要在两者上运行(但不必与其他编译器一起编译)。
有没有办法“模仿”它?类似的东西:
#define nullptr NULL
(显然这根本不会奏效,只是为了表明我的意思。)
答案 0 :(得分:61)
The Official proposal有一个解决方法 -
const // this is a const object...
class {
public:
template<class T> // convertible to any type
operator T*() const // of null non-member
{ return 0; } // pointer...
template<class C, class T> // or any type of null
operator T C::*() const // member pointer...
{ return 0; }
private:
void operator&() const; // whose address can't be taken
} nullptr = {}; // and whose name is nullptr
答案 1 :(得分:9)
从4.6开始,gcc支持nullptr。
答案 2 :(得分:6)
此外,gcc(实际上是g ++)多年来一直有一个扩展__null。当nullptr提案出来时,这被视为行业实施经验。
__null扩展可以检测特殊情况并警告它们,例如意外地将NULL传递给bool参数,当它打算传递给指针参数时(对函数进行更改,忘记调整调用端)。
当然这不便携。上面的模板解决方案是可移植的。
答案 3 :(得分:5)
它看起来是通过gcc 4.6.1(Ubuntu 11.11 oneiric),添加了nullptr。
我的hpp / cpp文件快速,递归的sed find-and-replace对我来说很好用:
find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g'
答案 4 :(得分:2)
你很可能忘了-std = c ++ 0x。 我的Mingw版本的gcc是4.6.1 / 4.7.1,都支持nullptr。
根据“c ++标准库,教程和参考,第2版”中的描述,nullptr是一个关键字,可以自动转换为每个指针类型而不是整数类型,这就克服了NULL的缺点,这对于模糊不清以下过载功能: void f(int); void f(void *);
F(NULL); //暧昧 F(nullptr); //好的
在VC2010中测试此功能表明MSDN文件与实际编译器冲突,文件说:
nullptr关键字不是类型,不支持与:
一起使用的sizeof
typeid的
throw nullptr
实际上在VC2010中,所有上述运算符/表达式都是合法的。 sizeof(nullptr)result 4. typeid.name()result std :: nullptr_t,throw nullptr可以被“const void *”和“void *”(以及其他指针类型)捕获。
虽然gcc(4.7.1)对于nullptr看起来更加严格,但是无法通过“void *”捕获throw nullptr,可以通过'...'来捕获