C++ 重载一元运算符&; 让我们考虑一个具有超载的一元运算符和(地址)的类。让它成为A类 template <class C> class A { public: C * operator &() { return &data; } //... private: C data; }

C++ 重载一元运算符&; 让我们考虑一个具有超载的一元运算符和(地址)的类。让它成为A类 template <class C> class A { public: C * operator &() { return &data; } //... private: C data; },c++,operator-overloading,C++,Operator Overloading,但是很清楚为什么下面的代码不能工作(甚至不能编译)。这是因为调用了重载运算符 A a; f(&a); 问题如下: 是否有语法将a的地址传递给f?如果没有,那么对我来说,很奇怪为什么允许重载一元操作符&,因为这会使代码更容易出错,更难理解。或者还有其他原因?使用boost::addressof函数。无论如何,重载一元&是非常可疑的。为什么不使用返回数据地址的命名函数呢?这就是为什么要发明它。为什么要重载一元运算符& 除此之外,还有boost::addressof您的场景从未真正出现过,因

但是很清楚为什么下面的代码不能工作(甚至不能编译)。这是因为调用了重载运算符

A a;
f(&a);
问题如下:


是否有语法将
a
的地址传递给
f
?如果没有,那么对我来说,很奇怪为什么允许重载一元
操作符&
,因为这会使代码更容易出错,更难理解。或者还有其他原因?

使用
boost::addressof
函数。无论如何,重载一元&是非常可疑的。为什么不使用返回数据地址的命名函数呢?

这就是为什么要发明它。

为什么要重载一元
运算符&


除此之外,还有
boost::addressof

您的场景从未真正出现过,因为编写该函数的任何人都将使用引用,而不是指针。另外,您忘了用C的示例类型实例化A

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

是的,有难看的语法:

f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
f(reinterpret\u cast是一个很好的通用包装器

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

其他人已经指出了
boost::addressof
。它所依赖的机制是标准保证使用内置的address操作符将
转换重新解释为引用类型。boost函数只是包装了相当冗长和笨拙的转换组合

如果没有,那么对我来说,很奇怪为什么允许重载一元运算符&, 因为if会使代码更容易出错,更难理解。或者还有其他一些问题 原因是什么

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


Cheers&hth.,

我同意允许它的标准是可疑的,甚至可能是一个错误,因为对象的地址是一个比用于获取它的运算符更基本的概念,这就是为什么默认情况下每种类型都使用
运算符&
,而不是说
运算符+
。但是“为什么这样做”的经典答案也就是说,“我不想使用命名函数,因为我想写一个带地址的泛型代码,并与
int
一起工作,但是当这个类在那个泛型代码中使用时,我希望它使用这个其他地址”。所以解释一下为什么这是一个错误,我们就这样做了;-)例如,您可以将泛型代码更改为使用类型特征模板来获取地址,而不是一元代码。此功能作为
std::addressof()
包含在C++11中。相关:滥用运算符重载会使代码更难解码(从而更难理解)。像所有提供的工具一样,不要滥用它们。您询问语法,所以这不是答案,但您可以编写
A*A::addressof(){return this;}
I我的意见是:让
std::reference\u wrapper
重载
操作符&
返回\u ptr。不幸的是,它并没有被实现,并且产生的用户代码不像它可能的那样通用。
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );