可以在gcc模拟nullptr?
我看到nullptr
是在Visual Studio 2010中实现的。我喜欢这个概念,并希望尽快开始使用它。 但是GCC目前还不支持。 我的代码需要同时运行(但不必与其他编译器编译)。
有没有办法“模仿”呢? 就像是:
#define nullptr NULL
(这显然不能很好地工作,只是为了表明我的意思。)
官方的build议有一个解决方法 –
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 TC::*() const // member pointer... { return 0; } private: void operator&() const; // whose address can't be taken } nullptr = {}; // and whose name is nullptr
它看起来像gcc从4.6支持nullptr。
另外,gcc(实际上是g ++)已经有一个扩展__null多年了。 当nullptr提案出来时,这被视为行业实施经验。
__null扩展可以检测到特殊情况,并警告它们,比如意图传递给指针参数(对函数进行更改,忘记调用调用方)时,意外地将NULL传递给bool参数。
当然这不是便携式的。 上述模板解决scheme是可移植的。
它看起来像gcc 4.6.1(Ubuntu 11.11 oneiric),nullptr已被添加。
对我的hpp / cpp文件进行快速的recursionsed查找和replace,对我来说工作得很好:
find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g'
这很可能是你忘记了-std = c ++ 0x。 我的Mingw版本的gcc是4.6.1 / 4.7.1,都支持nullptr。
根据“The C ++ standard library,tutorial and reference,2nd”中的描述,nullptr是一个关键字,可以自动转换为每个指针types而不是整数types,这克服了NULL的缺点,这对于下面的重载函数是不明确的:void f(int); void f(void *);
F(NULL); //不明确的f(nullptr); // 好
在VC2010中testing这个function表明,MSDN文档与实际的编译器冲突,文档说:
nullptr关键字不是一个types,不支持用于:
的sizeof
typeid的
抛出nullptr
实际上在VC2010中,上面所有的运算符/expression式都是合法的。 sizeof(nullptr)结果4. typeid.name()结果std :: nullptr_t和throw nullptr可以被“const void *”和“void *”(和其他指针types)捕获。
虽然gcc(4.7.1)对于nullptr看起来更加严格,但throw nullptr不能被“void *”捕获,可以被“…”