请原谅这个糟糕的标题...
所以,通常在这样的函数中:
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
是转发/通用引用如果您没有明确提供第二个模板参数。
关于c++ - 模板类型错误的通用引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387675/