decltype(auto)函数的返回类型不推断&&类型

时间:2019-05-07 14:45:23

标签: c++

如果函数返回decltype(auto)并返回int &&类型的局部变量,为什么返回类型为int&?

如果我将变量转换为自己的类型,那么返回类型就是我期望的(int &&)

#include <utility>

namespace{
    auto i = 5;
    auto j = 5;

    decltype(auto) foo1(){
        int&& ret = std::move(i);
        return ret;
    }

    decltype(auto) foo2(){
        int&& ret = std::move(j);
        return static_cast<decltype(ret)>(ret);
    }
}

int main(){
    static_assert(std::is_same_v<decltype(foo1()),int&>);
    static_assert(std::is_same_v<decltype(foo2()),int&&>);
}

1 个答案:

答案 0 :(得分:3)

这似乎是GCC中的错误。由于decltype(ret)int&&,因此foo1的返回类型为int&&。但是,这立即导致foo1格式不正确,因为返回int&&的函数不能从ret初始化返回值,这是一个左值(您将需要std::move使它正常工作)。请注意,Clang拥有此权利(请参见问题注释中的链接)。

相关问题