我想返回多个值,并使用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)};