return 语句将右值引用绑定到左值
return statement binding rvalue reference to an lvalue?
我从多个来源了解到,在 C++11 中,函数的返回值可以从由命名局部变量组成的 return 语句中移动构造。 例如:
class A {};
A f() {
A a;
return a;
}
int main() {
f();
}
也就是说,在 C++11 中,函数调用表达式 f()
临时指定的 prvalue 是从函数的局部变量 a
移动构造的,而不是像 C++03 中那样复制构造。 当然,这都是语义上讲的,在采取任何级别的优化之前,复制省略、NRVO 等。
我的问题是,A
的移动构造函数的参数是 A&&
型的,它只能绑定到 prvalue 或 xvalue,对吧? 那么,哪个特定的例外规则允许它绑定到这里的左值a
呢? 谢谢。
哪个特定的例外规则允许它绑定到这里的左值 A?
这就是12.8[class.copy]/32
当满足或将满足复制操作省略的条件(源对象是函数参数,并且要复制的对象由左值指定)时,首先执行重载解析以选择复制的构造函数,就像对象由右值指定一样。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 了解C++如何返回引用并绑定到引用
- 模板允许左值与右值引用绑定
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- C++通过绑定到引用成员而缩短临时变量寿命?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 对结构成员的临时绑定引用
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 为什么我可以在初始化引用后重新绑定引用?
- 为什么按引用传入会导致绑定引用类型错误
- 返回非常量引用会导致绑定引用错误
- 递归到迭代而不重新绑定引用
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除
- 为什么C++不允许重新绑定引用?