我已经厌倦了等待编译器对nullptr的支持(gcc 4.6 does,但它是一个新的发行版,很少有发行版支持它)。
因此,在完全支持nullptr之前,作为权宜之计,我决定效仿它。这里有两个仿真示例:一个来自here,另一个来自wikibooks。
值得注意的是,这两个实现都没有提到operator ==。但是,如果没有,下面的代码就是will not compile。
int* ptr = nullptr;
assert( ptr == nullptr ); // error here: missing operator ==这个operator ==错误是编译器错误吗?
是否需要operator == (以及!=、<、<=等)来更完美地模拟nullptr
模拟的nullptr和真实的交易还有什么不同?
发布于 2011-06-08 01:34:32
您使用C++0x编译器编译了它,但由于未知原因而失败。It compiles fine in C++03。
发布于 2011-06-08 01:27:11
是的,你应该实现这样一个东西。然而,我感到惊讶的是,隐式转换运算符没有发挥作用,允许您在不提供显式运算符的情况下进行比较。
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发布于 2011-06-08 01:28:10
这实际上是在你的第一个例子引用的官方提案中提到的:
用几个流行的现有编译器进行的
实验表明,它为第2节中描述的几个常见用例生成了糟糕的和/或误导性的编译器诊断。(示例包括:“没有从”const“到”int“的转换;”没有合适的从“const class”到“int”的转换函数“”;“模板参数不能引用未命名的类型”;“没有运算符”==“与这些操作数匹配,操作数类型是:int==const class”。)我们认为,编译器仍然需要添加nullptr的专门知识,以便为常见用例提供高质量的诊断。
因此,如果编译器还没有填补这个空白,你应该自己来填补。
https://stackoverflow.com/questions/6269124
复制相似问题