如何根据参数从函数左值或右值return?
How to return from function lvalue or rvalue based on parameters?
考虑示例:
#include <string>
#include <iostream>
auto get_r_value() { return std::string("hello"); }
int VAL = 15;
int& get_l_value() { return VAL;}
template<typename ...Types> auto&& func(Types... vars) {
if constexpr (sizeof ... (vars) <= 2) {
return get_l_value();
} else {
return get_r_value(); // warning: returning reference to temporary
}
}
int main() {
auto&& a = get_l_value();
a = 20;
std::cout << VAL << std::endl; // print 20
auto&& b = get_r_value(); // auto&& works as expected!
std::cout << b << std::endl;
func(1, 2) = 30;
std::cout << VAL << std::endl; // print 30
std::cout << func(1, 2, 3) << std::endl; // SEGMENTATION FAULT!
return 0;
}
我们可以看到 auto&&
类型在 return 类型时不起作用!
有没有什么方法可以根据模板参数从函数 lvalue 或 rvalue return?
您可以使用 decltype(auto)
:
template<typename ...Types> decltype(auto) func(Types... vars) {
if constexpr (sizeof ... (vars) <= 2) {
return get_l_value();
} else {
return get_r_value();
}
}
考虑示例:
#include <string>
#include <iostream>
auto get_r_value() { return std::string("hello"); }
int VAL = 15;
int& get_l_value() { return VAL;}
template<typename ...Types> auto&& func(Types... vars) {
if constexpr (sizeof ... (vars) <= 2) {
return get_l_value();
} else {
return get_r_value(); // warning: returning reference to temporary
}
}
int main() {
auto&& a = get_l_value();
a = 20;
std::cout << VAL << std::endl; // print 20
auto&& b = get_r_value(); // auto&& works as expected!
std::cout << b << std::endl;
func(1, 2) = 30;
std::cout << VAL << std::endl; // print 30
std::cout << func(1, 2, 3) << std::endl; // SEGMENTATION FAULT!
return 0;
}
我们可以看到 auto&&
类型在 return 类型时不起作用!
有没有什么方法可以根据模板参数从函数 lvalue 或 rvalue return?
您可以使用 decltype(auto)
:
template<typename ...Types> decltype(auto) func(Types... vars) {
if constexpr (sizeof ... (vars) <= 2) {
return get_l_value();
} else {
return get_r_value();
}
}