如何根据参数从函数左值或右值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 类型时不起作用!

有没有什么方法可以根据模板参数从函数 lvaluervalue 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();
    }
}

Demo