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

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

最佳答案 像这样:

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

由于您删除了复制构造函数(应该使用A const& btw),因此不会隐式声明A的移动构造函数,因此您尝试使用的表单无论如何都不会在元组之外有效:

A a = A(1); // error

如果你需要一个移动构造函数,你需要显式地写一个:

A(A&& rhs) = default;

这将是有效的:

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

请注意,前向是多余的,因为A(1)已经是右值.

I can’t modify the class A in any manner.

鉴于此,你不能创建一个std :: tuple< A>.成员int是私有的,所以你不能像我最初提出的那样访问它来使用int构造函数.没有移动构造函数,因此您也不能使用它.这是你的两个选择 – 这两个选项显然都不可行.

而且,你甚至不能制作一个std :: tuple< std :: shared_ptr< A>>因为A是不可复制的,你无法获得int成员.

游戏结束了,伙计.游戏结束.

点赞