C++ 提示编译器在使用auto时通过引用返回,而不使用->;

C++ 提示编译器在使用auto时通过引用返回,而不使用->;,c++,reference,c++17,return-type,auto,C++,Reference,C++17,Return Type,Auto,我有一个将返回类型设置为自动的函数。如果我想通过引用返回一些东西,通常我可以简单地用->T&提示编译器。但是,在我的特定情况下,我有一个模板函数,它具有通过if constexpr表达式定义的不同返回路径。大概是这样的: template<typename T> auto fn(T& arg) { if constexpr (std::is_same_v<T, int>) return; else return ar

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

template<typename T>
auto fn(T& arg)
{
    if constexpr (std::is_same_v<T, int>)
        return;
    else
        return arg;
}
模板
自动fn(T&arg)
{
如果constexpr(std::is_same_v)
返回;
其他的
返回arg;
}
我想在第二种情况下通过引用返回
arg
。有没有办法提示编译器函数体中的类型? 我知道我可以执行std::ref(arg),但是返回的类型是引用包装器,因此如果执行
auto&res=fn(arg)
操作,当我尝试将其用作实际引用时,它就会失败。基本上,我想要通过
->T&
得到的普通行为,但是对于可以返回各种类型的函数,所以我想在函数体中提供提示。

这就是
decltype(auto)
的目的。把你的签名改成

template<typename T>
decltype(auto) fn(T& arg)
模板
decltype(自动)fn(T&arg)
改用
decltype(auto)
,其计算结果与您返回的表达式的确切类型一致:

template<typename T>
decltype(auto) fn(T& arg)
{
    if constexpr (std::is_same_v<T, int>)
        return;
    else
        return arg;
}
模板
decltype(自动)fn(T&arg)
{
如果constexpr(std::is_same_v)
返回;
其他的
返回arg;
}
  • 调用
    inti时;fn(i),返回类型将为
    void

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


您的实例提供了支持性证据,而不是proof@Peter:公平,改变。