模板类型错误的通用引用

时间:2016-11-02 18:54:17

标签: c++ rvalue universal-reference

原谅糟糕的头衔......

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

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&&也是右值参考。这种情况与上述情况不同。那么,T&&在这里成为右值引用的原因是什么呢?而不是普遍的引用?

1 个答案:

答案 0 :(得分:3)

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

f<int,5>根本不执行任何类型扣减,其参数为int&&。没有参考崩溃。

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

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

现在,t是转发/通用引用,如果您未明确提供第二个模板参数