我有一个要求,其中元组需要初始化如下.如何创建包含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成员.
游戏结束了,伙计.游戏结束.