c++ 左值引用运算符与赋值运算符优先级

njthzxwz  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(257)

我遇到了一个编译错误,我希望编译器隐式使用自定义左值引用操作符,而不是赋值操作符。
我已经生成了一个显示这种现象的最小可重复示例。有人能解释一下这里发生了什么,以及允许隐式左值引用操作符被调用的潜在方法吗?
如果我取消注解赋值操作符删除,这将无法编译:

#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;
}
zmeyuzjn

zmeyuzjn1#

但是即使operator=被注解,w = 1也不会调用operator [const] T&。它只是简单地使用wrapper(T)构造函数从1生成wrapper,然后隐式定义operator=将该值赋给w。如果您使用deleteoperator=,这显然是不可能的。
operator T&仅由cout行使用,因为它是一个operator,可以将wrapper(您没有为它重载<<)转换为<<可以处理的内容,即int
我猜您希望w = 1;隐式地表现为static_cast<int&>(w) = 1;
上面的答案本身是不完整的,因为整个问题可能是 * 为什么w = 1;的行为不像static_cast<int&>(w) = 1;?* 答案是operator=是特殊的,正如Artyer的评论中链接的答案所建议的那样。

相关问题