【问题标题】:How to enforce a calling of a moving constructor (C++)?如何强制调用移动构造函数(C++)?
【发布时间】:2015-07-19 01:40:33
【问题描述】:

我有这几行代码:

#include <iostream>

using namespace std;

class A
{
public:
  A() noexcept
  {
    cout << "A::A()" << endl;
  }
  A(const A&) noexcept
  {
    cout << "A::A(const A&)" << endl;
  }
  A(A&&) noexcept
  {
    cout << "A::A(A&&)" << endl;
  }
};

class B
{
public:

  B(const A& a) noexcept :
    _a(a)
  {}
  B(A&& a) noexcept :
    _a(a)
  {}

private:
  A _a;
};

int main(int argc, char* argv[])
{
  A a;
  B b1 = B(a);
  B b2 = B(A());
}

他们产生这个输出:

A::A()
A::A(const A&)
A::A()
A::A(const A&)

我需要做什么才能从B::B(A&amp;&amp;) 调用A::A(A&amp;&amp;)

如您所见,添加 noexcept 并不能解决此问题。

【问题讨论】:

    标签: c++ constructor move-semantics


    【解决方案1】:

    虽然atype 是对A 的右值引用,但a 本身就是一个左值。要保留其右值性,您需要使用std::move

    B(A&& a) noexcept :
      _a(std::move(a))
    {}
    

    【讨论】:

    • 是的!基本上相同的方式将使用static_cast&lt;A&amp;&amp;&gt;(a) 而不是std::move
    • 当然可以,但是std::move 更短、更惯用并且可以与const 限定的变量一起使用。
    • 但它需要包含utility 标头,这是出于使用目的对我来说不需要的,假设只调用move。所以这里有一些灵活性。
    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2011-05-22
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多