完美地模拟nullptr

时间:2011-06-07 17:21:54

标签: c++ null c++11 nullptr

我厌倦了等待nullptrgcc 4.6 does的编译器支持,但它是如此新的少数发行版支持它。)

因此,在完全支持nullptr之前,我决定模仿它。有两个仿真示例:一个来自here,另一个来自wikibooks

值得注意的是,两个实现都没有提及operator ==。但是,如果没有,则使用以下代码will not compile

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

这个operator ==错误是编译器错误吗? operator ==(以及!=<<=等)需要更完美地模仿nullptr吗? 模拟nullptr和真实交易之间还有什么不同?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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

答案 2 :(得分:1)

在您的第一个示例参考的官方提案中实际上提到了这一点:

  

实验与几个流行   现有的编译器表明它   产生穷人和/或误导   编译器诊断的几个   中描述的常见用例   第2节。(例子包括:“没有   从“const”转换为“int”“;   “从”const class“到”int“没有合适的转换函数   存在”; “模板参数可能不引用未命名的类型”; “没有   operator“==”匹配这些操作数,操作数类型为:int == const class   “。)我们相信编译器仍然需要添加   按顺序了解nullptr的特殊知识   为...提供高质量的诊断   常见用例。

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