c++ - 模板类型错误的通用引用

标签 c++ rvalue universal-reference

请原谅这个糟糕的标题...

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

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/

相关文章:

c++ - 可修改右值和常量右值有什么区别?

具有不可更改的通用引用函数模板的 C++ 重载解决方案

c++ - 默认情况下,pragma 一次应该位于每个标题的顶部

c++ - 找到巨大的已分配内存块

c++ - 为什么 const 函数返回左值而不是右值?

c++ - 左值参数是否更喜欢左值引用参数而不是通用引用?

C++代码查找文件中的所有IP地址

c++ - ServerApplication 看不到具有相对路径的文件

c++ - 临时对象的数据成员是 C++11 中的 xvalue 吗?