为什么从三元文字中绑定到const引用副本
Why does binding to const reference from a ternary make a copy?
我对此感到困惑:
#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临时副本,然后将其绑定到参考。
总而言之,使用条件操作员本身就是迫使制作副本的方法。
相关文章:
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- 对类型"项 *const"的引用无法绑定到类型为"const 项 *"的右值
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 为什么我的运算符=(T&&)模板只绑定到一个const&而不是一个&&?
- 错误:将"const double"绑定到类型为"double&"的引用会丢弃限定符
- 我应该始终使用"T&&"而不是"const T&"或"T&"来绑定到回调函数吗?
- 当int的值明确更改时,为什么引用对const int(绑定到int)的值会更改
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- std::clamp - 检测函数返回值是否绑定到 const T&
- 结构化绑定中的const引用扩展了分解对象的寿命
- C++ const&绑定到临时对象
- 为什么从三元文字中绑定到const引用副本
- 为什么 const 数组优先绑定到 const T& 参数而不是 T&& 参数?
- 通过将返回值绑定到const引用,C++性能得到改善
- 为什么不能将"const char*"的左值绑定到"const char* const&&?
- 构造函数中的 const int 引用是否可以安全地绑定到文本