重载一元运算符 &
Overloading unary operator &
让我们考虑一个具有重载一元运算符&(地址)。设为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 &
是非常奇怪的,因为这会使代码更加bug和难以理解。或者还有其他原因?
有什么语法可以把
a
的地址传给f
吗?
是的,有丑陋的语法:
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
boost::addressof
是一个很好的通用包装器。
使用std::addressof
函数(或C++11之前的boost::addressof
)。在任何情况下,重载一元&非常可疑。为什么不使用返回数据地址的命名函数呢?
有什么语法可以把a的地址传给f吗?
其他人已经指出boost::addressof
。它所依赖的机制是reinterpret_cast
引用类型的内置地址运算符的标准保证使用。Boost函数只是包装了相当冗长和笨拙的强制转换组合。
如果没有,那么对我来说,为什么允许重载一元运算符&是非常奇怪的;,因为if会使代码变得更加bug和难以理解。或者还有其他一些原因?
在某些情况下,它可能更方便。例如,智能指针类可能提供自定义地址运算符,以便支持将&p
作为实际参数写入T**
形式参数。然而,我认为现在;人们普遍认为;I don’我不是个好主意。
干杯&hth。,
为什么要重载一元operator&
?
除此之外,还有boost::addressof
。
您的场景永远不会真正出现,因为任何编写该函数的人都会使用引用,而不是指针。另外,您忘记了用C的示例类型实例化A。
这就是boost::addressof
被发明的原因。
- 一元*运算符的操作数是否期望一个 prvalue
- 一元"运算符"未在C++中定义
- C2675 一元运算符由错误的作用域引起
- 你能帮我了解重载一元运算符和二进制运算符之间的区别吗?
- 泛型lambda和一元+运算符
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么一元运算符和不需要完整类型?
- 在函数调用之前,一元运算符会否定运算符
- 一元运算符关联是否有意义
- 如何重载一元/运算符
- 使一元运算符为二进制运算符
- 如何从函数模板类成员内的转换算法参数指向一元运算符函数
- 运算符重载:一元运算符重载函数返回在此代码中如何工作
- C++中一元运算符重载困难
- MTL4 将一元运算符(例如 abs())元素应用于dense_vector<double>
- C++中的一元运算符重载类型(新手)
- 在C++中,将任意在位运算符转换为一元运算符
- 为后缀重载一元运算符
- 一元 + 运算符在 int& 上