当对象位于赋值的右侧时,重载赋值运算符

Overloading assignment operator when the object is on the right-hand side of the assignment

本文关键字:赋值运算符 重载 对象 于赋值 赋值      更新时间:2023-10-16

给定以下代码:

template <typename T>
struct Wrapper {
    T value;
    Wrapper(T val) : value(val) {}
}
int main() {
    Wrapper<int> x(42);
    int y = x; // need solution for y = x.value
    return 0;
 }

有没有办法实现分配

int y = x;

因此它意味着y=x.value.

我知道重载赋值运算符本身是不可能的,因为它应用于赋值左侧的对象,而标准不允许带有两个参数的友元函数。

如果通过重载任何其他运算符或使用一些特殊技巧都不可能实现这一点,除了调用Wrapper类提供的get方法,例如:

int y = x.get();

为什么不提供到T 的隐式转换

operator T() { return value; } 

这将导致赋值起作用,因为编译器将尝试将赋值的右侧转换为T。隐式转换将使成功

请注意,这将导致除赋值之外的其他转换工作。例如,现在可以将Wrapper<T>实例作为T参数传递。这可能适用于也可能不适用于您的特定场景