我正在尝试重新学习 C++,并且我倾向于对一切工作原理有一个错综复杂的理解(而不仅仅是“我该怎么做”)。所以我想知道为什么这会产生错误。是的,我知道重载的赋值运算符应该使用引用(如果我这样做的话它工作得很好),但我希望这个问题的答案可以帮助我更多地了解语言规则。
class some_class {
public:
int n1;
some_class(int z) : n1(z) { }
some_class(some_class &x) : n1(x.n1) { }
some_class operator= (some_class x) { n1 = x.n1; return *this; }
// some_class & operator= (some_class & x) { n1 = x.n1; return *this; } works fine
};
main () {
some_class a(10);
some_class b(20);
some_class c(30);
c = b = a; // error here
}
编译器(C++ 03)在线上给了我这个c = b = a
:
In function 'int main()':
error: no matching function for call to 'some_class::some_class(some_class)'
note: candidates are: some_class::some_class(some_class&)
note: some_class::some_class(int)
error: initializing argument 1 of 'some_class some_class::operator=(some_class)'
这让我感到困惑,因为b = a
工作正常,而且它正在寻找一个我在法律上不允许声明的构造函数。我意识到在 中c = b = a
,该b = a
部分返回一个值(不是引用),这可能导致结果被复制到临时文件中。但是为什么不会c = <temporary>
导致编译错误b = a
呢?知道发生了什么吗?