2011-06-07 34 views
5

我厌倦了等待编译器支持nullptrgcc 4.6 does,但它是如此新的几个分布支持它)。完美模拟nullptr

因此,作为到nullptr完全支持的止损,我决定效仿它。有两个仿真例子:一个来自here,另一个来自wikibooks

值得注意的是,两种实现都没有提到operator ==。但是,没有一个,下面的代码will not compile

int* ptr = nullptr; 
assert(ptr == nullptr); // error here: missing operator == 

这是operator ==错误的编译器错误?
operator ==(和!=,<,<=等)需要更完美地模拟nullptr
仿真的nullptr和真正的交易有什么不同?

+2

为什么你会这样做而不是'assert(ptr);'首先呢? – ildjarn 2011-06-07 17:23:16

+0

@尼尔·巴特沃斯:事实并非如此。 'nullptr'必须是标准的一部分,因为只有当每个人都使用相同的空指针类型'std :: nullptr_t'时,它才具有值。如果每个人都实现了自己的空指针,那么如何编写一个接受空指针的函数呢?你不知道什么是空指针类型。 – Puppy 2011-06-07 17:28:08

+0

@ildjarn:我用一个断言来清理代码。我的实际例子是'std :: remove(v.begin(),v.end(),nullptr);'它使用了相等运算符。而我不会只使用'std :: remove_if'的原因是我不想。我希望它能像真正的'nullptr'一样工作。 – 2011-06-07 17:41:29

回答

2

您使用C++ 0x编译器对其进行编译,该编译器由于未知原因而失败。它compiles fine in C++03

+0

所以,回到我原来的问题。这个错误是否是新的C++ 0x语言规则的影响?还是在添加其他C++ 0x功能时引入gcc的错误? – 2011-06-07 17:44:56

+2

@deft_code:1)您的代码无效C++ 0x,因为它使用关键字nullptr。 2)我90%确定这是一个GCC bug 3)已经有一个[类似的bug](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990)。 – ybungalobill 2011-06-07 17:45:55

+0

伟大的发现与该错误。我的[确切错误案例](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990#c4)在评论中列出。为了回应第1点,我必须说_no duh!_在完全兼容的C++ 0x编译器中显然是无效的。 gcc 4.5还没有完全兼容,因此我需要模仿一个关键字。 – 2011-06-07 17:57:00

1

是的,你应该实现这样的事情。然而,我感到惊讶的是,隐式转换运算符并没有踢进来,并且允许你在没有提供明确运算符的情况下进行比较。

template<typename T> bool operator==(T* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
template<typename C, typename R> bool operator==(R C::* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
// And the reverse 
1

它实际上是在正式建议从你的第一个实例参考提到:

实验与几个流行 现有编译表明它 产生差和/或误导性 编译器诊断为几个 第2节中描述的常见用例。(例子包括:“no const 从”const“转换为”int“”; “没有合适的转换函数from”const类“到”int“ 存在”; “模板参数可能不会引用未命名的类型”; “否 运算符”==“匹配这些操作数,操作数类型是:int == const类 ”。)我们认为编译器仍然需要添加 nullptr的专门知识,以便为 提供 的质量诊断常见用例。

所以如果编译器还没有,你应该自己填补这个空白。

+0

这个糟糕的编译器诊断讨论引用了一个未命名的'nullptr'类型。但是,标准委员会决定'nullptr'的类型为'nullptr_t'。当'nullptr'类被命名为'nullptr_t'时,所有这些隐含的错误消息都会变得更好。 – 2011-06-07 18:06:01

+0

@deft_code - 那么问题是什么呢? – littleadv 2011-06-07 18:13:04