我很困惑这个:
#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语句一样.
Bri*_*ian 11
条件运算符为其第二个和第三个操作数确定公共类型和值类别.无论选择哪个分支(由条件确定),相应的操作数都将转换为此常见类型和值类别.
在这种情况下X(),x两者都有类型X,所以常见的类型当然是X自己的.但结果是prvalue,因此如果x选择(条件为假),则应用左值到右值转换,创建一个prvalue临时副本x然后绑定到引用.
总之,使用条件运算符本身就是强制复制的原因.