如何使用没有复制构造函数的给定类初始化元组

时间:2016-05-07 18:53:15

标签: c++ tuples tuple-packing

我有一个要求,需要按如下方式初始化元组。如何创建包含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类。

1 个答案:

答案 0 :(得分:1)

像这样:

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

A的移动构造函数未被隐式声明,因为您delete复制构造函数(应该使用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构造函数。没有移动构造函数,因此您也不能使用它。这是你的两个选择 - 两者都不显然是可行的。

此外,您甚至无法制作std::tuple<std::shared_ptr<A>>,因为A再次int是不可复制的,您无法访问sh "/Library/Application Support/Jenkins/Uninstall.command" 成员。

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