c++ - 返回语句的显式移动需要什么时间?

  显示原文与译文双语对照的内容
0 0

注释另一个问题乔纳森Wakely响应我的语句:

你从不需要显式移动为局部变量函数返回值。 它是隐式的放在这儿

>

。。。 - 永远别说永远。。 你需要显式移动如果本地变量没有类型相同的返回类型,请.g 。 std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; },但是如果类型相同,其会将如果可能。。。

所以似乎有时我们可能移动局部变量在返回时。

该示例

std::unique_ptr<base> f() { 
  auto p = std::make_unique<derived>();
  p->foo(); 
  return p; 
}

不错,因为它给出了 编译错误

> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’

但我想知道是否我给你一次机会来检测通常和这就是我在这里的限制的语言规则或unique_ptr

时间:原作者:1个回答

0 0

这不是不超过65, unique_ptr,它是语言的限制,也会出现这种限制到任何 return语句调用转换构造函数带一个右值引用:

struct U { };
struct T {
  T(U&&) { }
};
T f() {
  U u;
  return u;  // error, cannot bind lvalue to U&&
}

这将不编译因为[ 类.copy] /32说:

当elision的条件满足的复制操作或是否满足保存为事实源对象是一个函数参数,由一个lvalue,重载方案以选择要复制的对象指定的构造函数将首先被执行,就像由rvalue,专用的对象。

这意味着中的表达式 return语句只能被视为右值如果是适合copy/move elision ( 又称NRVO ),但限制过高,因为它意味着它仅适用于在该类型是完全相同的,即使变量没多久就超出范围所以就是合理始终将被视为rvalue ( 从技术上讲作为xvalue,一个 到期值) 。

这是最近建议由 Richard Smith ( 和以前由Xeo ) 我认为这是个好主意。

Update : Core DR 1579 更改了规则,以便返回值将作为rvalue即使类型不相同。 gcc 5 实现的新规则,C++11以及C++14 。

原作者:
...