超载一元运算符&

Mih*_*yan 16 c++ operator-overloading

让我们考虑一个带有重载的一元运算符和(Address-of)的类.随它去class A

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

现在我想传递一些函数指针A来填充它data.我们称之为f

void f(A * auto_containter)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

但很明显为什么代码波纹管不起作用(甚至不会编译).这是因为调用了重载运算符.

A a;
f(&a);
Run Code Online (Sandbox Code Playgroud)

问题如下:

是否有任何语法传递的地址af?如果不是,那么对我来说,为什么它允许超载一元是非常奇怪的operator &,因为它使代码更加错误和难以理解.还是有其他一些原因?

Kir*_*sky 17

是否有任何语法传递的地址af

是的,语法难看:

f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
Run Code Online (Sandbox Code Playgroud)

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


Arm*_*yan 13

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

  • 这个功能作为`std :: addressof()`包含在C++ 11中. (6认同)
  • 例如,您可以更改通用代码以使用类型特征模板来获取地址,而不是一元&. (4认同)
  • 我认为,这是在标准半信半疑,甚至可能是错误的,允许它,因为对象的地址是不是用来获取它的运营商,这就是为什么每一个类型与`运营商的'默认情况下,不同的作品更根本的概念,比如说`运营商+`.但经典的答案,"为什么这样做"是说,"我不希望使用一个命名函数,因为我想写通用码取地址,并用`int`工作,但在使用这个类在那个通用代码中我希望它使用这个其他地址".所以解释为什么这是一个错误,我们已经完成;-) (3认同)