4

次のようにタプルを初期化する必要があるという要件があります。クラス A のオブジェクトを含むタプルを作成するにはどうすればよいですか?

#include <iostream>
#include <tuple>

using namespace std;

class A{
  int a;

public:
  A(const A&)=delete;
  A(int a): a(a){}
};

std::tuple<A>& createTuple(A &&a){
  return std::make_tuple<A>(std::forward<A>(a));
}
int main(){
  std::cout << std::get<0>(createTuple(std::forward<A>(A(1))));
}

クラス A を変更することはできません。

4

1 に答える 1

2

そのようです:

std::tuple<A> t(1);

Adeleteのムーブ コンストラクターは、コピー コンストラクター ( A const&btw を取る必要があります)を作成したため、暗黙的に宣言されていませtupleん。

A a = A(1); // error

移動コンストラクターが必要な場合は、明示的に記述する必要があります。

A(A&& rhs) = default;

どの時点でこれが機能するか:

std::tuple<A> t(A(1));

はすでに右辺値であるため、forward冗長であることに注意してください。A(1)


クラスAを変更することはできません。

それを考えると、あなたは作ることができませんstd::tuple<A>。メンバーはプライベートであるため、最初に提案したようにコンストラクターintを使用するためにアクセスすることはできません。int移動コンストラクターがないため、それも使用できません。これらはあなたの 2 つの選択肢でした。どちらも明らかに実行可能ではありません。

さらに、これもコピー不可であり、メンバーを取得する方法がないため、 を作成することさえできませstd::tuple<std::shared_ptr<A>>ん。Aint

ゲームオーバー、男。ゲームオーバー。

于 2016-05-07T19:06:59.217 に答える