重载一元运算符 &

Overloading unary operator &

本文关键字:一元 运算符 重载      更新时间:2023-10-16

让我们考虑一个具有重载一元运算符&(地址)。设为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 &是非常奇怪的,因为这会使代码更加bug和难以理解。或者还有其他原因?

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

是的,有丑陋的语法:

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

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

使用std::addressof函数(或C++11之前的boost::addressof)。在任何情况下,重载一元&非常可疑。为什么不使用返回数据地址的命名函数呢?

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

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

如果没有,那么对我来说,为什么允许重载一元运算符&是非常奇怪的;,因为if会使代码变得更加bug和难以理解。或者还有其他一些原因?

在某些情况下,它可能更方便。例如,智能指针类可能提供自定义地址运算符,以便支持将&p作为实际参数写入T**形式参数。然而,我认为现在;人们普遍认为;I don’我不是个好主意。

干杯&hth。,

为什么要重载一元operator&

除此之外,还有boost::addressof

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

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