可以在gcc中模拟nullptr吗?

问题描述:

我看到在Visual Studio 2010中实现了nullptr。我喜欢这个概念,并希望尽快开始使用它;但是GCC目前还不支持它。我的代码需要同时运行(但不必与其他编译器一起编译)。可以在gcc中模拟nullptr吗?

有没有办法“模仿”它?喜欢的东西:

#define nullptr NULL 

(这显然不会都很好地工作,它只是为了说明我的意思。)

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 
+3

谢谢。你是否也知道是否有办法检测'nullptr'是否被实现,而不依赖于__cplusplus的版本(因为技术上我使用的是C++ 0x,而nullptr不在那里) – nuzz 2010-03-10 19:33:40

+10

@nuzz:那么你是不是不使用C++ 0x。 :) – Bill 2010-03-10 19:34:33

+3

那么,我使用的是C++ 0x的一部分;) – nuzz 2010-03-10 20:01:31

它看起来像GCC从4.6支持nullptr。

此外,gcc(实际上是g ++)多年来有一个扩展__null。当nullptr提案出来时,这被视为行业实施经验。

__null扩展可以检测到特殊情况并警告它们,例如意外传递NULL给bool参数,当它打算传递给指针参数时(对功能所做的更改,忘记调整呼叫端) 。

当然这不是便携式的。上述模板解决方案是便携式的。

+0

__null正是为gcc定义的NULL,它用于发出警告。它与使用NULL没有区别,并且不具有与nullptr相同的语义。 – rdb 2016-12-03 20:53:43

它看起来像gcc 4.6.1(Ubuntu 11.11 oneiric),nullptr已被添加。

快速,递归我的HPP/cpp文件SED查找和替换工作对我罚款:

find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g' 

这很可能是您忘记-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); // OK

测试此功能在VC2010表明,与实际的编译文件MSDN冲突,文件说:

的nullptr关键字是不是一个类型的,并且不支持使用:

的sizeof

typeid的

掷nullptr

其实在VC2010,上述所有运营商/快递离子是合法的。 sizeof(nullptr)结果4. typeid.name()结果std :: nullptr_t和throw nullptr可以被“const void *”和“void *”(以及其他指针类型)捕获。

虽然gcc(4.7.1)看起来比较偏硬一点,但nullptr不能被“void *”捕获,可以被'...捕获'

+3

不,从gcc刚刚不支持'nullptr'的时候,这个问题很可能已经有2年了。但4.6支持它的答案实际上已经是1.5岁了。所以我想你的“答案”已经完全过时了。 – 2012-06-28 07:31:09