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

问题描述 投票:0回答:1

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

我已经生成了一个最小的可重现示例来显示该现象。有人可以解释这里发生了什么,以及允许调用隐式左值引用运算符的潜在方法吗?

如果我取消注释赋值运算符删除,则编译失败:

#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;
}
c++ operator-overloading
1个回答
0
投票

但是即使

operator=
被评论,
w = 1
也没有打电话给
operator [const] T&
。它只是使用
wrapper(T)
构造函数从
wrapper
中创建一个
1
,然后隐式定义的
operator=
将该值赋给
w
。如果你
delete
operator=
,那显然是不可能的。

operator T&
仅由
cout
行使用,因为它是一个
operator
可以将
wrapper
(为此您没有超载
<<
)转换为
<<
可以处理的东西,
int
.

© www.soinside.com 2019 - 2024. All rights reserved.