为什么从三元文字中绑定到const引用副本

Why does binding to const reference from a ternary make a copy?

本文关键字:绑定 const 副本 引用 文字 三元 为什么      更新时间:2023-10-16

我对此感到困惑:

#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.
}

为什么第二次调用会临时副本?

编辑:这个问题不是关于X的类型,而是制作副本的事实。我从接受的答案中错过了价值类别的过度类别,并且预计F的参数将在x或x()上绑定到直接绑定在x或x()上,就像在将其作为if语句时所绑定。

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

在这种情况下,X()x都具有X类型,因此常见类型当然是X本身。但是结果是一个prvalue,因此,如果选择了 x(条件为false),则应用LVALUE-to-rvalue转换,从而创建x的Prvalue临时副本,然后将其绑定到参考。

总而言之,使用条件操作员本身就是迫使制作副本的方法。

相关文章: