可以在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
此外,gcc(实际上是g ++)多年来有一个扩展__null。当nullptr提案出来时,这被视为行业实施经验。
__null扩展可以检测到特殊情况并警告它们,例如意外传递NULL给bool参数,当它打算传递给指针参数时(对功能所做的更改,忘记调整呼叫端) 。
当然这不是便携式的。上述模板解决方案是便携式的。
__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 *”捕获,可以被'...捕获'
不,从gcc刚刚不支持'nullptr'的时候,这个问题很可能已经有2年了。但4.6支持它的答案实际上已经是1.5岁了。所以我想你的“答案”已经完全过时了。 – 2012-06-28 07:31:09
谢谢。你是否也知道是否有办法检测'nullptr'是否被实现,而不依赖于__cplusplus的版本(因为技术上我使用的是C++ 0x,而nullptr不在那里) – nuzz 2010-03-10 19:33:40
@nuzz:那么你是不是不使用C++ 0x。 :) – Bill 2010-03-10 19:34:33
那么,我使用的是C++ 0x的一部分;) – nuzz 2010-03-10 20:01:31