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

时间:2015-05-06 21:28:26

标签: 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.
}

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

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

1 个答案:

答案 0 :(得分:11)

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

在这种情况下,X()x都有X类型,因此公共类型当然是X本身。但结果是prvalue,所以如果选择x(条件为假),则应用左值到右值的转换,创建x的prvalue临时副本,然后将其绑定到参考

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