【问题标题】:C++ : create a tuple with vector of stringsC++:用字符串向量创建一个元组
【发布时间】:2020-10-26 15:31:26
【问题描述】:

我有以下 API 需要实现:

tuple<vector<string>, ItemStatus> SomeFcn() const
{
    vector<string> result_item;
    return tuple(result_item, ItemStatus::ACTUAL );
}

但它不编译,编译输出根本不清楚

/usr/include/c++/9/bits/stl_pair.h:436:9: 注意:候选:'template std::pair<_t1 _t2>::pair(std::tuple<_args1 ...>&, std::tuple<_args2 ...>&, std::_Index_tuple<_indexes1 ...>, std::_Index_tuple<_indexes2 ...>)' 第436章对(元组<_args1...>&,元组<_args2...>&, | ^~~~ /usr/include/c++/9/bits/stl_pair.h:436:9:注意:模板参数推导/替换失败:

创建元组实例时出现问题。我用-std=c++17 编译了这段代码。 ItemStatus 是一个枚举类。

这里有什么问题?

【问题讨论】:

  • 您的问题被标记为 C++11(没有类模板参数推导),而您提到您正在使用 C++17 进行编译:您使用的是什么语言级别?
  • 我用 g++ -std=c++17 -O0 -g3 编译
  • 我目前没有编译器,所以我无法测试这个:尝试在返回调用中用括号包裹ˋresult_itemˋ。
  • 您只是尝试return {result_item, ItemStatus::ACTUAL }; 吗?
  • 你试过std::make_tuple()了吗?

标签: c++ c++17


【解决方案1】:

基本上,您有三个选择:

return {result_item, ItemStatus::ACTUAL };
  • 创建一个元组对象 (make_tuple)(AndersK 的回答):
return std::make_tuple(result_item, ItemStatus::ACTUAL );
return std::tuple<std::vector<std::string>, ItemStatus>{result_item, ItemStatus::ACTUAL };

【讨论】:

  • 会使用std::move 提高(或损害)其中任何一个的性能(假设result_item 实际上是一个巨大的vector,因为总是返回一个空的函数似乎有点毫无意义)?
  • @ShadowRanger:这已经是一个返回声明。编译器知道局部变量超出范围并且可以安全地从中移出。
  • 正如@MSalters 所说,我不会那样做。此外,与复制省略和NRVO高度相关:stackoverflow.com/questions/12953127/…
  • 明确一点:您不想在返回表达式上调用std::move。另一方面,在 std::make_tuple 的参数上调用 std::move 是有意义的。
  • @ShadowRanger:想多了,看到还没有答案,我又提出了一个新问题:stackoverflow.com/questions/64541229/…
【解决方案2】:

改为这样写,假设 ItemStatus 是一个枚举

std::tuple<std::vector<std::string>, ItemStatus> SomeFcn() const
{
  std::vector<std::string> result_item;
  return std::make_tuple(result_item, ItemStatus::ACTUAL );
}

(* 我不喜欢将命名空间排除在外 *)

【讨论】:

  • @Dmitry,那么也许您应该考虑接受答案?
  • ups,抱歉 - 我投了赞成票,但忘了接受……我的错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2011-07-24
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多