模板类型错误的通用引用

universal reference for template type error

本文关键字:引用 错误 类型      更新时间:2023-10-16

请原谅这个糟糕的标题…

通常在这样的函数中:

template <class T>
void f(T&& i){
}

T&&是一个通用参考。在这样的上下文中,它是一个右值引用:

template <class T>
struct s{
    void f(T&& t){}
};

这是有意义的,因为T相对于s是一个固定类型,而f()是一个方法。

然而,显然在这个上下文中:

template <class T, unsigned n>
std::array<T, n>
f(T&&){
}

T&&也是右值引用。不过,这种情况与上面的情况不同。那么,T&&在这里也是右值引用而不是通用引用的原因是什么呢?

这是因为您显式地提供了参数类型(我假设这么多,但这是使示例编译的唯一方法)。

f<int,5>不执行任何类型推导,其形参为int&&。没有引用坍缩。

您可以通过编写f模板来解决这个问题:

template<unsigned n, typename T>
array<decay_t<T>, n>
f(T&& t);

现在,t是一个转发/通用引用,如果你不显式地提供第二个模板参数