【问题标题】:Perfectly emulate nullptr完美模拟 nullptr
【发布时间】:2011-09-10 06:42:20
【问题描述】:

我已经厌倦了等待 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 和真正的交易之间还有什么不同?

【问题讨论】:

  • 一开始你为什么要这样做而不是assert(ptr);
  • @Neil Butterworth:这不是真的。 nullptr 必须是标准的一部分,因为它只有在每个人都使用相同的空指针类型时才有价值 - std::nullptr_t。如果每个人都实现了自己的空指针,你将如何编写一个接受空指针的函数?你不知道空指针类型是什么。
  • @ildjarn:我使用了一个断言来清理代码。我的实际示例是使用相等运算符的std::remove( v.begin(), v.end(), nullptr );。我不会只使用std::remove_if 的原因是我不想。我希望它像真正的 nullptr 一样工作。
  • 很公平,我没有考虑标准库中的含义。

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


【解决方案1】:

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

【讨论】:

  • 那么,回到我原来的问题。这个错误是新的 c++0x 语言规则的影响吗?还是在添加其他 c++0x 特性时引入 gcc 的 bug?
  • @deft_code: 1) 你的代码是无效的 C++0x,因为它使用了关键字 nullptr。 2) 我 90% 确定这是一个 GCC 错误 3) 已经有一个 similar bug
  • 很好地发现了那个错误。我的exact error case 列在 cmets 中。针对第 1 点,我必须说 no duh! 在完全兼容的 c++0x 编译器中显然是无效的。 gcc 4.5 还不完全兼容,因此我需要模拟一个关键字。
【解决方案2】:

是的,你应该实现这样的事情。然而,令我惊讶的是,隐式转换运算符没有起作用,并且允许您在不提供显式运算符的情况下进行比较。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 那个糟糕的编译器诊断讨论涉及到一个未命名的nullptr 类型。但是,标准委员会决定nullptr 将具有nullptr_t 类型。当 nullptr 类被命名为 nullptr_t 时,所有这些神秘的错误消息都会变得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多