5

我厌倦了等待编译器支持nullptrgcc 4.6 确实如此,但它是如此新的几个发行版支持它)。

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

值得注意的是,两个实现都没有提到operator ==. 但是,没有一个,下面的代码将无法编译

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

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

4

3 回答 3

3

您使用 C++0x 编译器编译它,但由于未知原因而失败。它在 C++03 中编译得很好

于 2011-06-07T17:34:32.343 回答
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
于 2011-06-07T17:27:10.540 回答
1

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

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

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

于 2011-06-07T17:28:09.553 回答