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