C++ C++;:使用字符串向量创建元组

C++ C++;:使用字符串向量创建元组,c++,c++17,C++,C++17,我将实施以下API: tuple<vector<string>, ItemStatus> SomeFcn() const { vector<string> result_item; return tuple(result_item, ItemStatus::ACTUAL ); } tuple SomeFcn()常量 { 向量结果项; 返回元组(result\u item,ItemStatus::ACTUAL); } 但它不编译,编译输出也不

我将实施以下API:

tuple<vector<string>, ItemStatus> SomeFcn() const
{
    vector<string> result_item;
    return tuple(result_item, ItemStatus::ACTUAL );
}
tuple SomeFcn()常量
{
向量结果项;
返回元组(result\u item,ItemStatus::ACTUAL);
}
但它不编译,编译输出也不清楚

/usr/include/c++/9/bits/stl_pair.h:436:9: note: candidate: ‘template<class ... _Args1, long unsigned int ..._Indexes1, class ... _Args2, long unsigned int ..._Indexes2> std::pair<_T1, _T2>::pair(std::tuple<_Args1 ...>&, std::tuple<_Args2 ...>&, std::_Index_tuple<_Indexes1 ...>, std::_Index_tuple<_Indexes2 ...>)’ 436 | pair(tuple<_Args1...>&, tuple<_Args2...>&, | ^~~~ /usr/include/c++/9/bits/stl_pair.h:436:9: note: template argument deduction/substitution failed: /usr/include/c++/9/bits/stl_-pair.h:436:9:note:candidate:'template std::pair::pair(std::tuple&,std::tuple&,std:。' 436 |对(元组&,元组&, | ^~~~ /usr/include/c++/9/bits/stl_pair.h:436:9:注意:模板参数推导/替换失败: 创建元组实例时出错。我使用
-std=c++17
ItemStatus
是枚举类编译了此代码


这里出了什么问题?

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

std::tuple<std::vector<std::string>, ItemStatus> SomeFcn() const
{
  std::vector<std::string> result_item;
  return std::make_tuple(result_item, ItemStatus::ACTUAL );
}
std::tuple SomeFcn()常量
{
std::矢量结果_项;
返回std::make_元组(result_item,ItemStatus::ACTUAL);
}

(*我不喜欢将名称空间省略*)

基本上,您有三种选择:

  • :
  • 创建一个元组对象()(AndersK的答案):
  • 使用:
返回std::tuple{result\u item,ItemStatus::ACTUAL};

您的问题用C++11标记(它没有类模板参数推断)你提到你是用C++17编译的:你使用的是什么语言级别?我用g++-std=C++17-O0-G3编译它,目前我手头没有编译器,所以我无法测试:尝试在返回调用中用括号括起ˋresult_itemˋ。你只是尝试了
返回{result_item,ItemStatus::ACTUAL}
?您试过了吗?使用
std::move
会提高(或损害)其中任何一项的性能吗(假设
result\u item
实际上是一个巨大的
向量,因为总是返回空向量的函数似乎毫无意义)?@ShadowRanger:它已经是一个返回语句了。编译器知道局部变量超出了范围,可以安全地从中移动。正如@MSalters所说,我不会这么做。此外,与复制省略和NRVO高度相关:只是明确地说:你不想在返回表达式上调用
std::move
。调用
std::move STD的论点:另一方面,Maxututuple 是有意义的。”SuthWangRang:更多地思考它,并且看到它还没有开始,我提出了一个新的问题:“德米特里,那么也许你应该考虑接受答案?UPS,对不起,我投票赞成,但是忘了接受……我的错。
return {result_item, ItemStatus::ACTUAL };
return std::make_tuple(result_item, ItemStatus::ACTUAL );
return std::tuple<std::vector<std::string>, ItemStatus>{result_item, ItemStatus::ACTUAL };