C++ 为什么';t这个std::字符串C++;代码给出编译时错误?

C++ 为什么';t这个std::字符串C++;代码给出编译时错误?,c++,string,move-semantics,C++,String,Move Semantics,我有以下片段: #include <string> int main(int argc, char *argv[]) { std::string a, b, c; a + b = c; return 0; } #包括 int main(int argc,char*argv[]) { std::字符串a、b、c; a+b=c; 返回0; } 为什么这个C++代码不提供编译时错误?这可能是因为std::string::operator+的实现方式,但我的问题

我有以下片段:

#include <string>

int main(int argc, char *argv[])
{
    std::string a, b, c;
    a + b = c;
    return 0;
}
#包括
int main(int argc,char*argv[])
{
std::字符串a、b、c;
a+b=c;
返回0;
}

为什么这个C++代码不提供编译时错误?这可能是因为
std::string::operator+
的实现方式,但我的问题是:为什么要这样实现?在什么情况下需要这种行为?

您可以指定给临时对象。没有任何规则可以阻止这一点

如果您不希望在临时(更一般地说,在r值上)上调用成员函数,可以在函数声明中使用

但正如您所看到的,
std::string::operator=
没有ref限定的版本


我不认为标准委员会允许这种行为有明确的目标;我想这一选择背后的基本原理是给程序员施加尽可能少的规则,让他找到一个有用的应用程序(如果有的话)。

为什么会出现编译错误?a+B返回一个有效的字符串对象。至于用途呢?可能不是usable@DavidHaimOP可能希望它失败的原因与它失败的原因相同
a,b,c
were
int
。有人能为它列出一个有效的用例吗?@KarolyHorvath任何有效的用例都会涉及一个构造函数、析构函数或
操作符=
,并产生副作用;在任何其他情况下,该表达式的行为都类似于noop,imho。@PaoloM:我的意思是对于
std::string
。我想问题在于,临时性是如何临时的。
xa、b、c类的结果;a+b=c可能是可取的,因为临时性导致某些修改的全局状态被更新。带有副作用的赋值运算符听起来像是一个巨大的反模式me@DarkWanderer我不知道抛出是否会被视为一种副作用,但可以肯定的是赋值运算符可以抛出。它可以,但如果使用它,然后编写代码的人将依赖于抛出,这也有点代码味道。@DarkWanderer,确实如此