1

我无法理解为什么以下内容(至少根据 gcc 4.8)在 C++11 中是合法的:

// This class manages a non-copyable resource.
struct B {
  B();
  B(B &&) { /* logging, etc., to verify if needed. */ }
private:
  B(B const &);
  B const &operator=(B const &);
};

B bar() {
  B b;
  // This is apparently allowed via the move constructor.
  return b;
};

int main() {
  // From this "side" of the call as well.
  B b1 = bar();
  B b2{bar()};
}

在什么情况下语言允许或实际首选移动构造函数?临时返回值似乎可以移动(和垃圾内容),但我想为所有可以静默使用移动的地方找到核心语言规则。谢谢!

4

2 回答 2

0

rvalue只要参数绑定到引用,编译器就可以使用移动。只要参数是 a prvalue(见下文),编译器就会使用它。参数也可以转换为rvalue引用。

通常,右值是出现在赋值右侧的任何内容。一个粗略的思考方式是看它是否可以在代码中被引用。左值有身份,右值通常没有。

真的,有几种类型的左值和右值......

  • lvalue- 有身份,不能移动(lvalue
  • xvalue- 有身份,可以移动(lvaluervalue
  • prvalue- 没有身份,可以移动(rvalue

Anxvalue既是lvalue,又是rvalue。一个示例是您使用 . 显式转换为rvalue引用的内容std::move

于 2014-04-05T23:07:56.813 回答
-1

此外,还有一个很好的关于右值引用和移动语义的介绍http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

于 2014-04-05T23:04:34.297 回答