0

原谅标题不好...

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

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&&那么,这里也是右值引用而不是通用引用的原因是什么?

4

1 回答 1

3

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

f<int,5>根本不执行类型推导,它的参数是int&&. 没有参考崩溃发生。

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

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

现在,如果您不明确提供第二个模板参数t,则它是一个转发/通用参考。

于 2016-11-02T18:59:30.443 回答