为什么给对象赋值时不使用转换函数?

Sam*_*Sam 12 c++ explicit type-conversion assignment-operator language-lawyer

我了解到我们可以为 C++ 中的类提供转换运算符。所以我预计对于以下程序,c=1;会使用转换运算符int()。但令我惊讶的是;但这并没有发生,我们得到一个编译器错误,指出

error: no match for 'operator=' (operand types are 'C' and 'int')

所以我想知道为什么这里不使用转换运算符。

struct C {
    explicit C(int);
    operator int&(); 
};

int main() {
    C c({});
    c = 1;   //this gives error. Why the conversion operator int&() is not used here?
}
Run Code Online (Sandbox Code Playgroud)

请注意,我知道如果我explicit从构造函数中删除关键字就可以解决该错误。但我的问题是为什么不使用转换运算符。

我认为既然我们的类有一个转换运算符,那么可以将类对象转换为 anint以便可以将其分配给。

use*_*570 13

我认为既然我们的类有一个转换运算符,那么可以将类对象转换为 int 以便对其进行赋值。

因为内置赋值运算符的左侧操作数不考虑用户定义的转换。这可以从表达式文档中的运算符中看到:

对于内置赋值运算符,左操作数的转换受到如下限制:

  • 没有引入临时变量来保存左操作数,并且
  • 没有用户定义的转换应用于左操作数以实现与内置候选者的最左边参数的类型匹配。

(强调我的)

这意味着该程序格式错误

  • “如果 x 具有类类型,则“x = y”始终意味着“x.operator=(y)””是我见过的最清晰的方式 (4认同)
  • @Artyer 是的,对于一个外行来说应该足够好了。除非 C++ 如此简单(或者有如此简单的措辞)。 (3认同)