编译器错误?返回std::tuple中的std::vector和std::string.但我得到了奇怪的价值观



我想返回多个值,并使用auto声明该函数。

但这并不奏效。无法正确返回值。它被覆盖了。

我尝试执行以下函数f1~f3。这些函数应该返回元组中的向量和字符串。但只有f3工作良好。

#include <iostream>
#include <vector>
#include <string>
#include <tuple>
auto f1(){
std::vector<double> v(10, 0);
std::string s = "hello";
return std::forward_as_tuple(v, s);
}
auto f2(){
std::vector<double> v(10, 0);
return std::forward_as_tuple(v, "hello");
}
std::tuple<std::vector<double>, std::string> f3(){
std::vector<double> v(10, 0);
std::string s = "hello";
return std::forward_as_tuple(v, s);   
}
int main(void){
//change the function
//auto [vec, str] = f1();
//auto [vec, str] = f2();
auto [vec, str] = f2();
for (auto e : vec){
std::cout << "vec : " << e << std::endl;
}
std::cout << "str : " << str << std::endl;
}

您也可以通过此链接在在线编译器wandbox上执行此程序。

  • f1()导致分段故障
  • f2()std::vector中返回错误的值。这似乎是随机数
  • f3()正确返回所有值

为什么会出现此问题?是否不可能返回多个值并使用auto声明该函数?

问题的出现是因为std::forward_as_tuple返回对局部变量的引用-返回类型为tuple<vector<double>&,string&>

前两个函数产生未定义的行为。

第三种方法有效,因为您显式地按值返回,尽管转发不起作用,因为您没有移动l-值,所以它们被复制到返回的元组中。

返回元组的正确方法是:

return std::tuple{std::move(vec),std::move(str)};

最新更新