我遇到了一个编译错误,我希望编译器隐式使用自定义左值引用运算符而不是赋值运算符。
我已经生成了一个最小的可重现示例来显示该现象。有人可以解释这里发生了什么,以及允许调用隐式左值引用运算符的潜在方法吗?
如果我取消注释赋值运算符删除,则编译失败:
#include <iostream>
template <typename T>
struct wrapper
{
private:
T t;
public:
wrapper( T _t ) : t( _t ) {}
// wrapper<T> operator=( T ) = delete;
operator const T&() const { return t; }
operator T&() { return t; }
};
int main()
{
wrapper<int> w( 0 );
std::cout << w << std::endl;
w = 1;
std::cout << w << std::endl;
}
但是即使
operator=
被评论,w = 1
也没有打电话给operator [const] T&
。它只是使用 wrapper(T)
构造函数从 wrapper
中创建一个 1
,然后隐式定义的 operator=
将该值赋给 w
。如果你delete
operator=
,那显然是不可能的。
operator T&
仅由 cout
行使用,因为它是一个 operator
可以将 wrapper
(为此您没有超载 <<
)转换为 <<
可以处理的东西, int
.