超载一元运算符&

时间:2011-06-20 11:17:00

标签: c++ operator-overloading

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

6 个答案:

答案 0 :(得分:17)

  

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

是的,语法很丑陋:

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

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

答案 1 :(得分:13)

使用boost::addressof功能。在任何情况下,超载一元&amp;非常可疑。为什么不使用返回数据地址的命名函数呢?

答案 2 :(得分:4)

  

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

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

  

如果不是,那么对我而言,为什么它允许超载一元运算符&amp ;,这是非常奇怪的,   因为如果会使代码更加错误和难以理解。或者还有其他一些   原因是什么?

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

干杯&amp;第h。,

答案 3 :(得分:2)

为什么你想要重载一元operator&

除此之外,还有boost::addressof

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

相关问题