模板类型错误的通用参考

universal reference for template type error

不好意思的标题...

所以,通常在这样的函数中:

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

T&& 是通用参考。在这样的上下文中,它是 rvalue-reference:

template <class T>
struct s{

    void f(T&& t){}

};

这是有道理的,因为 T 是相对于 s 的固定类型,其中 f() 是一种方法。

然而,显然在这种情况下:

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

T&& 也是一个 rvalue-reference。不过,这种情况与上述情况不同。那么,T&& 在这里也是 rvalue-reference 而不是通用的原因是什么?

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

f<int,5>根本不执行类型推导,它的参数是int&&。没有引用崩溃正在进行。

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

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

现在,t 是一个 forwarding/universal 参考 如果您没有明确提供第二个模板参数