【问题标题】:Does it ever make sense to overload unary operator &?重载一元运算符 & 是否有意义?
【发布时间】:2010-10-16 11:16:12
【问题描述】:

因此,C++ 允许重载一元 operator &(地址)。当operator & 被合理地超载时,您是否知道任何真实世界 示例?第二个更具体的问题是,您是否知道任何现实世界示例,当operator & 在保留地址语义的同时被合理地重载? TIA

【问题讨论】:

  • @Johannes:谢谢!我从来不知道谷歌代码搜索。很遗憾我不能接受评论作为答案:)

标签: c++ operator-overloading


【解决方案1】:

我有 operator &() 的 207 个真实世界示例:Code search 1Code search 2

包括SafeInt<>(获取底层裸整数)、boost::gil(显然也是为了产生原始数据)、Mozilla(说“定义 operator& 是有风险的,但是,嘿,我们知道我们是什么”正在做。”)、wxWidgets、Armagetron 等等。

似乎有些人使用迭代器习语&*it 来获取原始引用或向后指针,并编写*&it 来获取原始引用和&it 来获取原始指针。

请注意,一旦您的类型重载 operator& 并返回与内置运算符不同的内容,您的类型就不再是 CopyConstructible(在 C++03 中 - C++0x 似乎已经解除了它),因此不能不再用作标准容器中的元素类型。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 谢谢,这正是我一直在寻找的
    【解决方案3】:

    我不知道一个具体的例子,但我可以想象一个容器类,你可能想要返回一个智能指针或迭代器。不过,我并不是说这一定是有道理的。

    【讨论】:

    • 我的问题是——特别是——关于现实世界的例子
    • 你说得对,奥利。智能指针是必须表现得像指针的类,因此需要运算符 * 甚至 & 重载。砰的一声。
    • @Samrat:智能指针的 & 重载到底能给你带来什么?!
    • @Samrat:我想这可行,但在语义上有点烦人。想想*&pObj 不会让你回到你开始的地方!
    • @Samrat:使用相同的逻辑,必须为任何代理对象(包括迭代器)重载 operator& ......我希望你同意这是疯狂的。 Oli 的论点也很有说服力
    【解决方案4】:

    重载它的一个很好的理由可能是使其成为private,以防止用户使用它。我想不出任何你想防止这种情况发生的实际例子,但这似乎是重载它的最合乎逻辑的理由。

    【讨论】:

      【解决方案5】:

      当一个对象有一个特殊用途的智能指针时,我做过一次。 operator& 悄悄地将堆栈分配的对象“提升”为基于堆的智能指针版本,一旦对象位于指针内,此运算符的行为就会有所不同。

      我没有代码了,但当时有 一个原因。这当然不是一个掉以轻心的决定,这条路两旁都是尸体。

      【讨论】:

        【解决方案6】:

        在编写与 Direct3D 交互的类时,我重载了此运算符。这是一个智能指针类,需要从 operator& 返回 T**,以便它可以在需要指针到指针的函数中使用。 T** 语义很少见,但在某些情况下确实需要它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-18
          • 2010-10-21
          • 1970-01-01
          • 2017-07-20
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          相关资源
          最近更新 更多