3

コンストラクターが 1 つしかないクラスがあるとします。

class T {
 public:
  T(BigClass&& big) : big(std::move(big)) {}
  ...

  SomeBigClass
};

ほとんどの場合、コンストラクターは一時的に呼び出されますが、一時的なものではなく、ループで複数回使用されるため、BigClass の明示的なコピーを作成する必要がある場所があります。

void foo(const BigClass& big) {
  while (...) {
    T t(std::make_a_copy(big));
    ...
  }
}

std::move上記の make_a_copy を置き換える C++11 または C++14 の「デュアル」関数はありますか?

編集:いくつかの説明。

4

3 に答える 3

6

BigClassオブジェクトをコピーできないのはなぜですか?

void foo(const BigClass& big) {
  while (...) {
    T t{ BigClass(big) };
    ...
  }
}

これにより、一時的に作成BigClassされ、次に移動されますT

于 2013-07-06T00:15:01.633 に答える
1

書くのは難しくありません:

template <typename T>
T make_temp(const T& x) { return x; }

1 つの引数で呼び出されたときにたまたまそれを行う標準関数があるかもしれませんが、この異常なパターン用に設計された関数はありません。

于 2013-07-07T00:50:46.920 に答える
-1

操作できる場合Tは、コンストラクターをテンプレート化できます。

#include <iostream>
using namespace std;
class B
{
  int x;
public:
  B (int i) : x(i) { }
  B (B && b) : x(b.x) { cout << "B moved (" << x << ")" << endl; }
  B (B const  & b) : x(b.x)  { cout << "B copied (" << x << ")" << endl; }
};


class A
{
  B b;
public:
  template<typename TB>
  A (TB && init_b) : b(std::forward<TB &&>(init_b)) { }
};

B foo (void) { B x(3); return x; }


int main (void)
{
  A a1(foo());
  B b1(4);
  A a2(b1);
  return 0;
}

版画

B 移動 (3)
B コピー (4)

参照の折りたたみを理解している限りA(B&)、 のコピー コンストラクターへのコンストラクター転送と の移動コンストラクターへの転送を行う必要がありBます。A(B&&)B

于 2013-07-05T23:05:10.750 に答える