我有一个将返回类型设置为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&
来获得原始行为,但是对于可以返回各种类型的函数,我想在函数体内提供提示。
答案 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&
。
答案 1 :(得分:1)
这就是decltype(auto)
的作用。只需将您的签名更改为
template<typename T>
decltype(auto) fn(T& arg)