提示使用auto时编译器按引用返回,而不使用->

时间:2019-07-18 14:10:30

标签: c++ reference c++17 return-type auto

我有一个将返回类型设置为auto的函数。如果我想通过引用返回某些东西,通常我可以简单地用-> T&提示编译器。但是在我的特定情况下,我有一个模板化函数,该函数具有通过if constexpr表达式定义的不同返回路径。像这样:

template<typename T>
auto fn(T& arg)
{
    if constexpr (std::is_same_v<T, int>)
        return;
    else
        return arg;
}

在第二种情况下,我想通过引用返回arg。有没有办法向编译器提示函数体内的类型? 我知道我可以执行std :: ref(arg),但是返回的类型是引用包装,因此如果我执行auto& res = fn(arg),则当我尝试将其用作实际引用时,它只会失败。基本上,我希望可以通过-> T&来获得原始行为,但是对于可以返回各种类型的函数,我想在函数体内提供提示。

2 个答案:

答案 0 :(得分:3)

请改用decltype(auto),它会得出您要返回的表达式的确切类型:

template<typename T>
decltype(auto) fn(T& arg)
{
    if constexpr (std::is_same_v<T, int>)
        return;
    else
        return arg;
}
  • 调用int i; fn(i);时,返回类型为void

  • 调用float f; fn(f);时,返回类型为float&

live example on godbolt.org with static_assert evidence

答案 1 :(得分:1)

这就是decltype(auto)的作用。只需将您的签名更改为

template<typename T>
decltype(auto) fn(T& arg)