我遇到了一个编译错误,我希望编译器隐式使用自定义左值引用操作符,而不是赋值操作符。
我已经生成了一个显示这种现象的最小可重复示例。有人能解释一下这里发生了什么,以及允许隐式左值引用操作符被调用的潜在方法吗?
如果我取消注解赋值操作符删除,这将无法编译:
#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;
}
1条答案
按热度按时间zmeyuzjn1#
但是即使
operator=
被注解,w = 1
也不会调用operator [const] T&
。它只是简单地使用wrapper(T)
构造函数从1
生成wrapper
,然后隐式定义operator=
将该值赋给w
。如果您使用delete
operator=
,这显然是不可能的。operator T&
仅由cout
行使用,因为它是一个operator
,可以将wrapper
(您没有为它重载<<
)转换为<<
可以处理的内容,即int
。我猜您希望
w = 1;
隐式地表现为static_cast<int&>(w) = 1;
。上面的答案本身是不完整的,因为整个问题可能是 * 为什么
w = 1;
的行为不像static_cast<int&>(w) = 1;
?* 答案是operator=
是特殊的,正如Artyer的评论中链接的答案所建议的那样。