为什么+ =标准库中的有效临时值?

Cli*_*ton 5 c++ temporary

当我尝试在ideone上编译以下内容时:

class X
{
  public:
   friend X& operator+=(X& x, const X& y);
};

X& operator+=(X& x, const X& y) { return x; }

int main()
{
  X() += X();
}
Run Code Online (Sandbox Code Playgroud)

正如所料,这会引发编译错误,因为您无法将临时传递给非const引用.

但是,以下内容在ideone上成功编译:

std::string() += std::string();
Run Code Online (Sandbox Code Playgroud)

不应该像我上面的例子那样出错吗?

编辑:

如果std :: string()定义+=为成员操作,为什么在这样的用法允许左侧是临时的时候呢?为什么不像我上面那样定义它并避免引用临时问题?

Die*_*ühl 6

C++规则是您不能将临时绑定到非const引用.但是,您可以在临时对象上调用非const成员函数:如果您将其定义operator +=()为成员,则可以在对象上调用它.这是如何从临时中获取引用的技巧之一,例如,当使用临时std::istringstream读取非基本类型时(基本类型由成员读取):

std::string word;
if (std::istringstream("hello world") >> std::ws >> word) { ... }
Run Code Online (Sandbox Code Playgroud)

(是的,这一个愚蠢的例子).