为什么绑定到三元组的const引用会复制?

bki*_*ing 11 c++

我很困惑这个:

#include <iostream>
struct X {};
void f( const X &x ) { std::cerr << &x << "\n"; }

static X x;
int main()
{
  f( x ); // Off stack address
  f( false ? X() : x ); // Different address on stack.
}
Run Code Online (Sandbox Code Playgroud)

为什么f的第二次调用会产生临时副本?

编辑:这个问题不是关于类型X,而是复制的事实.我从接受的答案中忽略了值类别的过剩,并且期望f的参数直接绑定在x或X()上,就像将其重新表述为if语句一样.

Bri*_*ian 11

条件运算符为其第二个和第三个操作数确定公共类型和值类别.无论选择哪个分支(由条件确定),相应的操作数都将转换为此常见类型和值类别.

在这种情况下X(),x两者都有类型X,所以常见的类型当然是X自己的.但结果是prvalue,因此如果x选择(条件为假),则应用左值到右值转换,创建一个prvalue临时副本x然后绑定到引用.

总之,使用条件运算符本身就是强制复制的原因.