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);

A的移动构造函数没有被隐式声明,因为你deleted 复制构造函数(它应该采取A const&顺便说一句),所以你试图使用的形式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我最初建议的构造函数。没有移动构造函数,所以你也不能使用那个。那是您的两个选择-显然都不可行。

此外,您甚至无法创建一个,std::tuple<std::shared_ptr<A>>因为A它又是不可复制的,并且您无法访问该int成员。

游戏结束,伙计。游戏结束。

于 2016-05-07T19:06:59.217 回答