首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么T &&实例化为int&?

T &&实例化为int&的原因是因为T &&是一个右值引用类型,而int&是一个左值引用类型。在C++中,右值引用可以绑定到将要销毁的临时对象,而左值引用只能绑定到具有标识符的对象。

当使用T &&实例化为int&时,意味着我们将右值引用绑定到一个左值上,这是不允许的,因为右值引用的主要目的是为了支持移动语义和完美转发。

在这种情况下,编译器会发出错误,因为int&是一个左值引用类型,而T &&是一个右值引用类型,它们之间存在类型不匹配。

需要注意的是,T &&实例化为int&这种情况是不合法的,正确的实例化应该是T &&实例化为int。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Effective Modern C++翻译(2)-条款1:明白模板类型推导

    ,当他们向一个引用类型的参数传递一个const对象时,他们期待这个对象依旧是无法被修改的,比如,这个参数的类型被推导为一个指向const的引用,这就是为什么向带有一个T&参数的模板传递一个const对象是安全的...int& f(cx); // cx是一个左值, 所以T是const int&, // param的类型也是const int...int& f(27); // 27是一个rvalue, 所以T是int, // param类型是int&& 条款26精确的介绍了为什么这些例子会是这样...,函数类型也可以退化为指针,我们讨论的任何一个关于类型推导的规则和对数组相关的事情对于函数的类型推导也适用,函数类型会退化为函数的指针,因此 void someFunc(int, double); //...模板的参数是按值传递的时候,实例化的表达式的引用性和常量性将被忽略。 在类型推导期间,数组和函数将退化为指针类型,除非他们是被实例化为相应的引用。

    791100

    C++11(2)

    实例: int main() { 左值(左值是可以取地址的,一般是变量) int a = 2; int* b = new int(0); const int c = 20; //左值引用实例...,取的别名就是一个变量; const int& n = a + 3; //右值引用左值 int&& f = a; //会报错,无法直接引用左值,因为int 无法转化为int&& ; //但是可以强制转化类型...& 并不是右值引用,而是万能引用;这里的T可以是T&或T&&,如果是T是T&(左值)那么t的类型就是T&,如果T是T&&(右值)那么t的类型就是T&&; 右值引用退化问题 右值被引用后是可以修改的,这种情况其实就是右值退化为了左值...;如果函数里面还需要传递右值那么就需要使用强制转化类型将这个左值转化为右值; templateT> void PerfectForward(T&& t) { Fun(t);//这里的...t需要转化为右值 } 1.使用move转化为右值; templateT> void PerfectForward(T&& t) { Fun(move(t));//这里的t需要转化为右值

    5310

    模板进阶:特化与编译链接全解析

    // 两个参数偏特化为引用类型 template T1, typename T2> class DataT1&, T2&> { public: Data(const T1&...Dataint&, int&> d4(1, 2);:调用了特化的引用版本,因为两个参数是引用类型(注意,这里初始化引用类型参数时传递的是常量1和2,这些字面量会被隐式转换为合适的引用类型)。...模板匹配顺序:编译器在选择模板实例化时,会按照以下优先顺序进行匹配: 完全匹配的全特化(优先级最高) 最匹配的偏特化 最通用的模板 指针特化时const的修饰问题 为什么在参数列表使用const...已经特化的类中T表示为什么?...为什么不能分离定义? **原因:**模板实例化的代码并不是编译的时候在模板位置直接生成的,而是在需要实例化的时候才会生成特定的具体代码。 实例化时机:模板的实例化发生在编译器遇到模板函数或类的使用时。

    18110

    Python基础 | 为什么经常会将list()转化为numpy.array()类型

    在平时用python做开发或者阅读流行的开源框架的源码的时候,经常会看到一些代码将普通的列表list()类型转化为numpy的array(),如下所示: import numpy as np a = [...1,2,3,4,5] b = np.array(a) type(b) #numpy.ndarray 变量a是一个常见的Python列表类型,通过numpy.array()方法将该列表转化为了一个ndarray...为什么很多代码都会出现这样的操作?转化之后的numpy.array类型又会带来哪些好处呢?...下面代码是将列表转化为numpy.ndarray后支持的一些常用操作,根据方法名即可快速了解其含义。...从上面的案例分析讲解,大家可以看到为什么会将普通的列表类型转换为numpy.ndarray类型了,很重要的原因在于这种转化后,numpy.ndarray提供了很多常见的方法,使得我们不必自己编写代码就可以实现常见操作

    3.6K30

    【C++】C++模板基础知识篇

    泛型编程 实现一个通用的交换函数: void Swap(int& left, int& right) { int temp = left; left = right; right = temp;...隐式实例化:让编译器根据实参推演模板参数的实际类型 templateT> T Add(const T& left, const T& right) { return left + right...2.5 模板参数的匹配原则 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数 templateT> T Add(const T& left, const...T& right) { return left + right; } int Add(const int& left, const int& right) { return left + right...如果typedef能够解决像栈队列这些数据结构的问题,C语言为什么不供,就是语法不好用。 真正解决不了的是给栈里面数据类型不同的时候该怎么做?

    11210

    C++ 左值和右值

    ; //1.当T&& t接收的实参为左值时,T被推导为T&,t的类型为T&,t为左值,此时forward实例化为forwardT&>(T&) //2.1 //mytest2(10); /.../当T&& t接收的实参为右值时,T被推导为T,t的类型为T&&,t为左值,此时forward实例化为forwardT>(T&) //2.2 //mytest2(static_cast...(30)); //当T被显示指定为T&&时(此时形参T&& t只能接收右值实参),t的类型为T&&,t为左值,此时forward实例化为forwardT&&>(T&) func...,T被推导为T&,t的类型为T&,std::move(t)为右值,此时forward实例化为forwardT&>(T&&) //此时因为T被推导为T&,为左值,static_assert断言失败,会报错...//2.1 //mytest2(10); //当T&& t接收的实参为右值时,T被推导为T,t的类型为T&&,std::move(t)为右值,此时forward实例化为forwardT>(

    1.2K181
    领券