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

为什么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); //...模板的参数是按值传递的时候,实例化的表达式的引用性和常量性将被忽略。 在类型推导期间,数组和函数将退化为指针类型,除非他们是被实例化为相应的引用。

    786100

    C++ 左值和右值

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

    1.2K181

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

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

    15610

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

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

    10810

    【C++】C++11 右值引用和移动语义

    int a = 10; int& ra1 = a; //int& ra2 = 10; // 编译失败,因为10是右值 // const左值引用既可引用左值,也可引用右值。...PerfectForward(10); //右值 PerfectForward(std::move(b)); //const 右值 return 0; } 可以看到,不管实参为什么类型,模板函数都能正确接受并实例化为对应的引用类型...其中,当实参为左值或 const 左值时,T&& 会被实例化为 T& 或 const T&,我们称其为引用折叠,即将 && 折叠为 &。...如果实参是右值/ const 右值,虽然实例化函数的形参是右值引用/ const 右值引用,但是右值引用本身是左值;所以就会出现下面这种情况: void Fun(int& x) { cout << "左值引用...旅程二:为了让模板函数能同时接受 (const) 左值和 (const) 右值并正确实例化为对应的引用类型,C++11 又设计出了万能引用,附带的又引出了引用折叠这个概念;但是这样奇怪的设计让许多学习

    77610

    【Modern Cpp】从万能引用到完美转发

    在main()函数中,通过使用wrapper()来调用fun()函数(可能有人会有疑问,为什么需要额外增加一个封装wrapper,其实这样做正是为了引入后面的主题,否则后面内容没法写了)。...(T&& x); … }; 尽管该函数中出现了T &&这种形式,但由于成员函数在模板实例化之后才会存在,因此在实例化之前该成员函数可视为无效,假若我们当前对该模板执行实例化: std::vector... v; 这直接导致该模板被实例化为: class vector> { public: void push_back(int&& x); // rvalue...为了加深理解,示例如下: using T = int &; T& r1; // int& & r1 -> int& r1 T&& r2; // int& && r2 -> int& r2 using...(t); } 经过引用折叠后,则变成: int& forward(int& t) noexcept { return static_cast(t); } 而对于wrapper

    48720

    C++模板(初阶)

    泛型编程 先用一个简单的函数,来说明这个泛型编程: 交换两个数的函数:int Swap(int& a,int& b); 如果我们定义了这个函数,其参数是int&类型的,也就是只能将整型的数据进行交换,那么如果我一个项目里面...void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } void Swap(double& a, double& b) { double...隐式实例化:让编译器根据实参推演模板参数的实际类型 template T Add(const T& left, const T& right) { return left + right...使用显式实例化 return 0; } 也可以使用这样的方法: template T1 Add(const T1& left, const T2& right)...一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。

    39130

    【C++】模板初阶:泛型编程的起点

    例如下面的代码: void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap...我们可以看到下面的代码: void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }...) { int a = 10; double b = 20.0; // 显式实例化 Add(a, b); return 0; } 这样不管后面的形参时什么类型,编译器都会实例化为...int类型的Add函数; 2.5 模板参数的匹配原则 ✨ 1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数; 例如: // 专门处理int的加法函数...类模板 3.1概念 类模板是一种通用的类定义,可以实例化为多个具体的类。类模板中可以包含通用的成员变量、成员函数和成员类型。

    12710

    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.5K30

    如何编写一个通用的函数?

    使用模板之前: void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } void swap(double& a, double& b)...2.5, d2 = 4.1; cout << add(a, b) << endl; cout << add(d1, d2) << endl; //下面这句会报错,因为一个模板参数无法在一个函数中实例化为...错误示例: template T add(const T& a, const int& b)//直接修改参数,进行固定 { return a + b; } (4)模板匹配 对于函数名相同的非模板函数和模板函数同时存在时..._data; size_t _size; size_t _capacity; }; void test3() { A a1; //实例化为存储int数据的类 A a2; //实例化为存储double数据的类 } 本文只是对模板的初步了解,后续会遇到更加复杂的模板,比如多参数的模板等,知识一点点的学,不求速成,坚持一点点的积累,一起加油吧!

    18510
    领券