c – 如何使用没有复制构造函数的给定类初始化元组
发布时间:2020-12-16 07:16:22 所属栏目:百科 来源:网络整理
导读:我有一个要求,其中元组需要初始化如下.如何创建包含A类对象的元组? #include iostream#include tupleusing namespace std;class A{ int a;public: A(const A)=delete; A(int a): a(a){}};std::tupleA createTuple(A a){ return std::make_tupleA(std::forwa
我有一个要求,其中元组需要初始化如下.如何创建包含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)已经是右值.
鉴于此,你不能创建一个std :: tuple< A>.成员int是私有的,所以你不能像我最初提出的那样访问它来使用int构造函数.没有移动构造函数,因此您也不能使用它.这是你的两个选择 – 这两个选项显然都不可行. 而且,你甚至不能制作一个std :: tuple< std :: shared_ptr< A>>因为A是不可复制的,你无法获得int成员. 游戏结束了,伙计.游戏结束. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |