[英]Overloading unary operator &
让我们考虑一元运算符&(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 &
很奇怪,因为它使代码更容易出错且难以理解。 还是有其他原因?
是否有任何语法的地址传递
a
以f
?
是的,语法很丑陋:
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
boost::addressof
是一个不错的通用包装器。
使用boost::addressof
函数。 无论如何,一元和超载是高度可疑的。 为什么不使用命名函数返回数据地址呢?
有什么语法可以将a的地址传递给f?
其他人已经指出boost::addressof
。 它所依赖的机制是内置地址运算符的标准保证用法,用于将reinterpret_cast
为引用类型。 Boost函数只是包装了相当冗长而笨拙的转换组合。
如果否,那么对我来说,为什么允许重载一元运算符&很奇怪,因为如果这样做会使代码更加错误且难以理解。 还是有其他原因?
在某些情况下,它可能更方便。 例如,智能指针类可能会提供一个自定义地址运算符 ,以支持将&p
作为实际参数写入T**
形式参数。 但是,我认为,如今,人们普遍认为这并不是一个好主意。
干杯,……
为什么您要重载一元运算operator&
?
除此之外,还有boost::addressof
。
这就是为什么发明了boost::addressof
原因。
您的情况永远不会真正出现,因为编写该函数的任何人都将引用而不是指针。 另外,您忘了使用C的示例类型实例化A。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.