加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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)已经是右值.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读