首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完美模拟nullptr

完美模拟nullptr
EN

Stack Overflow用户
提问于 2011-06-08 01:21:54
回答 3查看 1.5K关注 0票数 5

我已经厌倦了等待编译器对nullptr的支持(gcc 4.6 does,但它是一个新的发行版,很少有发行版支持它)。

因此,在完全支持nullptr之前,作为权宜之计,我决定效仿它。这里有两个仿真示例:一个来自here,另一个来自wikibooks

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

代码语言:javascript
复制
int* ptr = nullptr;
assert( ptr == nullptr ); // error here: missing operator ==

这个operator ==错误是编译器错误吗?

是否需要operator == (以及!=<<=等)来更完美地模拟nullptr

模拟的nullptr和真实的交易还有什么不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-08 01:34:32

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-08 01:27:11

是的,你应该实现这样一个东西。然而,我感到惊讶的是,隐式转换运算符没有发挥作用,允许您在不提供显式运算符的情况下进行比较。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-06-08 01:28:10

这实际上是在你的第一个例子引用的官方提案中提到的:

用几个流行的现有编译器进行的

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6269124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档