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