【问题标题】:How to initialize a tuple with a given class having no copy constructor如何使用没有复制构造函数的给定类初始化元组
【发布时间】:2016-09-02 17:06:45
【问题描述】:

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

【问题讨论】:

  • 实际上想做什么,您的实际限制是什么?我的意思是,在这种情况下,我们可能可以从您的代码中推断/猜测它,但您应该使用 words 来解释它,以便该问题可搜索、可重复使用且清晰。
  • std::forward 不会像您认为的那样工作。在您的情况下,您在任何地方都不需要std::forward
  • 也在createTuple 中尝试返回对临时对象的左值引用。我

标签: c++ tuples tuple-packing


【解决方案1】:

像这样:

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

A 的移动构造函数没有被隐式声明,因为您 deleted 复制构造函数(应该采用 A const&amp; 顺便说一句),因此您尝试使用的表单在外部无效tuple 反正:

A a = A(1); // error

如果您需要移动构造函数,则需要显式编写一个:

A(A&& rhs) = default;

什么时候会起作用:

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

注意forward 是多余的,因为A(1) 已经是一个右值。


我无法以任何方式修改 A 类。

鉴于此,您无法创建std::tuple&lt;A&gt;。成员 int 是私有的,所以你不能像我最初建议的那样使用 int 构造函数来访问它。没有移动构造函数,所以你也不能使用那个。这是你的两个选择——显然都不可行。

此外,您甚至无法创建std::tuple&lt;std::shared_ptr&lt;A&gt;&gt;,因为A 是不可复制的,您无法访问int 成员。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
相关资源
最近更新 更多