【问题标题】:Overloading unary operator &重载一元运算符 &
【发布时间】:2011-09-18 14:45:06
【问题描述】:

让我们考虑一个具有重载一元运算符 & (Address-of) 的类。让它成为class A

template <class C>
class A
{
public:
    C * operator &()
    {
        return &data;
    }
    //...
private:
    C data;
}

现在我想将A 类型的指针传递给某个函数来填充它的data。让我们称之为f

void f(A * auto_containter)
{
    //...
}

但很清楚为什么下面的代码不起作用(甚至无法编译)。这是因为调用了重载的运算符。

A a;
f(&a);

问题如下:

是否有任何语法可以将a 的地址传递给f?如果不是,那么对我来说很奇怪为什么允许重载一元operator &amp;,因为它使代码更加错误且难以理解。还是有其他原因?

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:

是否有任何语法可以将a 的地址传递给f

是的,语法很丑:

f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );

boost::addressof 是一个很好的通用包装器。

【讨论】:

    【解决方案2】:

    使用boost::addressof 函数。无论如何,重载一元 & 是非常可疑的。为什么要这样做,而不是使用一个命名函数来返回数据的地址?

    【讨论】:

    • 我同意允许它是可疑的,甚至可能是标准中的错误,因为对象的地址是一个比用于获取它的运算符更基本的概念,这就是为什么每种类型都可以使用operator&amp; 默认情况下,不像 operator+。但是“为什么这样做”的经典答案是说,“我不想使用命名函数,因为我想编写带有地址的通用代码,并与 int 一起使用,但是当使用这个类时在那个通用代码中,我希望它使用这个其他地址”。所以解释一下为什么这是一个错误,我们就完成了;-)
    • 例如,您可以更改通用代码以使用类型特征模板来获取地址,而不是一元 &。
    • 此功能已包含在 C++11 中,名称为 std::addressof()
    【解决方案3】:

    有什么语法可以将a的地址传递给f吗?

    其他人已经指出boost::addressof。它所依赖的机制是对reinterpret_cast 引用类型的内置 地址运算符的标准保证使用。 Boost 函数只是包装了相当冗长和尴尬的强制转换组合。

    如果不是,那么对我来说很奇怪为什么允许重载一元运算符&, 因为 if 会使代码更加错误且难以理解。或者还有其他的 原因?

    在某些情况下,它可能更方便。例如,智能指针类可能提供 a custom address operator 以支持将 &amp;p 作为实际参数写入 T** 形式参数。但是,我认为现在人们普遍认为这并不是一个好主意。

    干杯,

    【讨论】:

      【解决方案4】:

      为什么要重载一元 operator&amp;

      除此之外,还有boost::addressof

      【讨论】:

      【解决方案5】:

      您的场景永远不会真正出现,因为编写该函数的任何人都会获取引用,而不是指针。另外,您忘记使用 C 的示例类型实例化 A。

      【讨论】:

        【解决方案6】:

        这就是发明boost::addressof 的原因。

        【讨论】:

          猜你喜欢
          • 2010-10-21
          • 1970-01-01
          • 2012-10-23
          • 2014-11-18
          • 1970-01-01
          • 1970-01-01
          • 2022-11-18
          • 2017-07-20
          相关资源
          最近更新 更多