可以在gcc中模拟nullptr吗?

时间:2010-03-10 19:15:37

标签: c++ gcc c++11 nullptr

我看到nullptr已在Visual Studio 2010中实现。我喜欢这个概念,并希望尽快开始使用它;但是GCC还不支持它。我的代码需要在两者上运行(但不必与其他编译器一起编译)。

有没有办法“模仿”它?类似的东西:

#define nullptr NULL

(显然这根本不会奏效,只是为了表明我的意思。)

5 个答案:

答案 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,可以通过'...'来捕获