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

3

我遇到了一个编译错误,希望编译器隐式使用自定义的左值引用运算符而不是赋值运算符。

我已经生成了一个最小可重现的示例来展示这种现象。有人能解释一下这里发生了什么,并可能提供允许调用隐式左值引用运算符的方法吗?

如果取消注释赋值运算符删除,则无法编译:

#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
请参见https://dev59.com/RVkS5IYBdhLWcg3wYl3V:w = 1 始终意味着w.operator=(1) - Artyer
1个回答

2

但是即使注释了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在评论中提到的答案所示。标准中相关的措辞在此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接