重载一元运算符 &

新手上路,请多包涵

让我们考虑一个具有重载一元运算符 & (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 & ,因为它使代码更加错误且难以理解。还是有其他原因?

原文由 Mihran Hovsepyan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 449
2 个回答

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

原文由 Armen Tsirunyan 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

是的,有丑陋的语法:

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

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

原文由 Kirill V. Lyadvinsky 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题