a[10];// (4) decltype(a)为int[10]decltype(func);// (5) 结果为int(int, int)(1)式decltype(x1)的结果和x1的类型一致,为int (4)和(5)都保留了原本的类型,这个也是和auto的推导结果不同的,使用auto推导的规则它们会退化为指针类型,这里则保留了它们数组和函数的类型。 (x1,x2);// (3) int&decltype(x1,0);// (4) intdecltype(a[1]);// (5) int&(1)式因为两个变量相加后返回一个数值,它是一个右值,所以推导结果和它的类型一致 (5)是访问数组中的元素,它是一个左值,因此推导结果是一个引用。 decltype(auto)的使用解析自动推导表达式的结果的类型decltype(auto)的使用语法规则如下:decltype(auto) var = expr;它的意思是定义一个变量var,auto
decltype用法 auto和decltype推导类型的区别 decltype用法: 1.decltype变量 2. 的主要作用 auto和decltype推导类型的区别 在中,我介绍了auto的用法及其实际编程中的应用,既然auto可以推导变量的类型,为什么C++11还引进decltype类型说明符呢? c的类型,也就是说,auto推导变量依赖于初始化它的表达式,并且auto声明的变量必须初始;而decltype是直接通过某一个表达式来获取数据类型,从而定义d的类型。 /错误,因为z的类型为const int&,必须初始化 auto w = ci;//w的类型是int w = 9; auto n = cj;//n的类型是int 2.decltype表达式 形式:decltype 参考: 《C++ Primer 第5版》2.5.3 以上就是decltype的详细介绍。如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。
auto x = 42; // x 推导为 int auto y = 3.14; // y 推导为 double auto ptr = new int(5); auto x = 42; decltype(x) y; // y 的类型为 int 区别和注意事项 auto 用于变量声明时的类型推导,而 decltype 用于获取表达式的类型。 auto 推导的类型是变量的初始值的类型,而 decltype 推导的类型是表达式的类型。 当表达式为引用类型时,auto 推导的类型会忽略引用,而 decltype 会保留引用。 std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it ! 和 decltype 的使用场景: unsetunset5. auto 和 decltype 的结合使用unsetunset auto 和 decltype 可以结合使用,以便在一个表达式中使用 decltype
pi 的类型被推导为 double高级特性与指针和引用结合使用int var5 = 0;auto ptr1 = &var5; // ptr1 为 int*auto ptr2 = &var5; / / ptr2 为 int*auto ref1 = var5; // ref1 为 int&auto ref2 = ref1; // ref2 为 int与 const 结合使用当类型不为引用时 #include <vector>#include <iostream>int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto 不能定义数组,例如 auto arr[] = var4; 是错误的。不能用于模板参数。decltype 关键字基本概念decltype 是一个操作符,用于查询表达式的类型,而不实际计算表达式的值。 auto 和 decltype 的结合使用auto 和 decltype 可以结合使用,以便在需要类型匹配的场景中自动推导变量类型。
例如: 我们在上面代码中增加 value4 和 value5: auto value4 = "QAQ", value5 = &value1; 我们可以看到,在编译时出现了报错,原因是因为 value4 推断出的类型是字符串型,而 value5 推断出来的类型是指针类型,一条语句在声明多个变量的时候,只能有一个基本数据类型,所以会有如下的错误出现。 decltype 关键字 而 decltype 类型说明符也是 C++11 的标准,它是用于从表达式的类型推断出要定义的变量的类型。 注:decltype()括号中的表达式并不去执行,而 decltype((variable)) 的结果永远是引用,而 decltype((variable)) 只有当 variable 本身是一个引用是才是引用 auto 关键字和 decltype 关键字的区别 对于 decltype 所用的表达式来说,如果变量名加上一对括号,则得到的类型与不加上括号的时候可能不同。
本文将深入探讨decltype和auto的工作原理,并进行比较。decltype详解decltype是一个用于查询表达式类型的关键字。它在编译时检查参数的类型,并生成该类型。 decltype与auto的比较decltype和auto都可以用于类型推导,但它们在处理类型时有所不同。 auto会忽略表达式的类型,只关注其值的类型:int x = 0;auto ax = (x); // ax的类型是int而decltype会考虑表达式的类型:int x = 0;decltype((x auto和decltype的工作原理深入解析理解auto和decltype的工作原理需要深入C++的类型系统和编译器的工作方式。auto的工作原理auto关键字的工作原理基于C++的类型推导规则。 实际上,auto的工作方式与函数模板参数的推导方式非常相似。decltype的工作原理decltype关键字的工作原理也基于C++的类型系统,但它的工作方式与auto有所不同。
推倒不出到底是什么类型 auto k = 5; auto\* pk = new auto(5); // auto 关键字声明的变量必须初始化,在一行时必须使用相同数据类型初始化 int (&),rvalue reference(&&) 来修饰auto auto k = 5; auto* pK = new auto(k); auto** ppK = new auto(&k); const // utter nonsense - not allowed void Fun(T t){} 5、定义在堆上的变量,使用了auto的表达式必须被初始化 int* p = new auto(0); as above 7、定义在一个auto序列的变量必须始终推导成同一类型 auto x1 = 5, x2 = 5.0, x3 = ‘r’; // This is too much….we cannot () << endl; // This will print int [9] 【decltype 关键字】 可以根据一个表达式或者根据一个变量推出类型。
前言 如果想要知道一个表达式的数据类型但又不想对表达式进行求值, 那么auto似乎就不满足这中要求, c++11加入了decltype操作符,它的功能与auto类似, 都是进行类型推导, 但是decltype , di并不必须要初始化 decltype(i + 0) j; decltype(function()) f; auto ai = i; // auto必须对其进行初始化 与auto不同, decltype 同时可以看出来auto比decltype多做了一层转换, 将数组转换成了指针. 3. decltype与顶层const 在分析顶层const时分析过, auto会忽略掉顶层const, 即 const 记住 : decltype((variable)), 有双括号时结果永远都是引用. 5. decltype与表达式求值结果 本来是想将这个放在引用中来讲, 但是还是抽离出来, 不然可能会混淆的. decltype推导出来 { return t1 + t1;} 这里auto放在函数前面只是一个返回类型的占位符, 并不是auto来推导返回值类型, 而是decltype在函数返回的时候来推导返回值的类型
本文将系统性地剖析auto和decltype的类型推导机制,并揭示其与模板、万能引用和完美转发的内在联系。第一部分:auto-编译器作为您的类型助手基础:为何使用auto? 无法推导T//必须显式指定:func<std::initializer_list<int>>({1,2,3});第二部分:decltype-获取表达式的精确类型decltype的使命与auto不同:它返回给定表达式的精确类型 decltype(auto)(C++14):这是一个组合关键字,它告诉编译器使用decltype的规则来推导auto。它主要用于函数返回类型和变量声明,以完美保留初始化表达式的类型。 需要精确类型时使用decltype:当你不只是想推导类型,而是需要知道表达式的精确类型(特别是引用性)时,使用decltype或decltype(auto)。 理解auto、decltype、万能引用和引用折叠之间的相互作用,是编写高效、现代、通用C++代码的关键。通过不断练习和推敲这些规则,你将能更好地利用这些工具,写出既安全又高效的代码。
功能 decltype可以将给定的表达式或变量的类型推导出来,包含引用和指针。 一般用于复杂表达式作为返回值的类型推导。 可以用于补足c++11的auto缺陷. 简单代码 template <typename T,typename I> auto show(T& a, I i) ->decltype(a[i]) { return a[i]; } 不好看 支持引用 template <typename T,typename I> decltype(auto) show(T& a, I i) { return a[i]; } auto表示类型推导 完善最终版 template <typename T,typename I> decltype(auto) show(T&& a, I i) { return std::forward<T>(a C++14允许decltype(auto)组合完美的推测.C++11可以通过后置的方式达到同样的效果.C++14更加简洁. 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
3.声明 3.1auto auto能自动进行类型推导,用auto用于变量的声明 ,编译器会自动的推导类型。 用途: 1.简化复杂类型变量的声明。 2.和范围for相结合。 4.在decltype中进行类型推导。 3.2decltype auto只能推导出类型decltype还能进行变量的运算,进行一系列的操作。 int a = 1; double b = 1.8; decltype(a * b) z; decltype(&z) w; cout << typeid(z).name() << endl; int a[5] = { 0,1,2,3,4 }; cout << a[8] << endl; array<int, 5> b{ 0,10,20,30,40 }; //报错 //cout << b[5] << endl; 5.2forward_list 单向链表,节省空间 forward_list 节省空间,不支持尾插尾删 list 双向链表
第 5 行代码是需要重点说明的,r1 本来是 int& 类型,但是 auto 却被推导为 int 类型,这表明当=右边的表达式是一个引用类型时,auto 会把引用抛弃,直接推导出它的原始类型。 第 5 行代码中,r1 是 const int & 类型,auto 也被推导为 const int 类型,这说明当 const 和引用结合时,auto 的推导将保留表达式的 const 类型。 2、decltype 的实际应用 auto 的语法格式比 decltype 简单,所以在一般的类型推导中,使用 auto 比使用 decltype 更加方便,你可以转到《C++ auto》查看很多类似的例子 三、汇总auto和decltype的区别 通过《C++ auto》和《C++ decltype》两节的学习,相信大家已经掌握了 auto 和 decltype 的语法规则以及使用场景,这节我们将 auto = 20; n3 = 5; //赋值报错 //指针类型 const int *p1 = &n1; auto p2 = p1; *p2 = 66; //赋值报错 decltype(p1) p3 = p1
在decltype产生之前,很多编译器的厂商都开发了自己的C++语言扩展用于类型推导。C++11则将这些类型推导手段进行了细致的考量,最终标准化为auto已经decltype。 前者可以参考之前的博客,这里着重讲decltype,如下例: int main() { int i; decltype(i) j = 0; cout << typeid(i).name() << endl; float a; double b; decltype(a + b) c; cout << typeid(c).name() << endl; } 运行结果: int double 从上例可以看出,decltype的类型推导并不像auto一样是从变量声明的初始化表达式获得变量的类型,decltype总是以一个普通的表达式为参数,返回该表达式的类型。 而与auto相同的是,作为一个类型指示符,decltype可以将获得的类型来定义另外一个变量。与auto相同,decltype类型推导也是在编译时进行的。
关于decltype操作符的说明: 1、在C++中,decltype作为操作符,用于查询表达式的数据类型。 2、从语义上说,decltype的设计适合于通用库编写者与编程新手。总体上说,对于目标对象或函数,由decltype推导出的类型与源码中的定义可精确匹配。 而正如sizeof操作符一样,decltype亦不需对操作数求值。 using namespace std; string::size_type FindChar(const string &s, char c, string::size_type &count) { auto return ret; } void Test() { string s1("lilililililililililili"); string::size_type Count = 0;; auto
include<vector> #include<iostream> using namespace std; int main() { vector<int> a = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }; vector<int> b { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }; for (auto e : a) { cout 3.2 decltype关键字 关键字decltype将变量的类型声明为表达式指定的类型。他和typeid有点像,不过进行的工作不一样: typeid:是用来查看变量的类型,返回值是一个字符串。 (); decltype(it1) it2 = dict.begin(); 这个在上面的场景是可以通过auto来代替的,但是有些情况decltype更加好用: 比如我们需要获取一个变量的类型来进行模版类初始化 decltype却可以帮助来获取类型! 3.3 nullptr 由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。
0. decltype关键字 decltype被称作类型说明符,它的作用是选择并返回操作数的数据类型。 解决问题二,可以使用auto和本文的主题:decltype。 关于decltype,需要注意: 工作原理 decltype + 变量 var decltype + 表达式 expr decltype + 函数名 func_name 1. 3. decltype + 表达式 ②当使用decltype(expr)的形式时,decltype会返回表达式结果对应的类型。 ③当使用decltype(func_name)的形式时,decltype会返回对应的函数类型,不会自动转换成相应的函数指针。 5.
一.auto&范围for 在C++98中auto是一个存储类型 的说明符,表明变量是局部自动存储类型 ,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。 在C++中常与【范围for】搭配使用 int main() { int i = 10; auto p = &i; auto pf = malloc; //auto x; 不能单独用 } int (2)或者作为模板实参 关键字decltype将变量的类型声明为表达式指定的类型 有以下两种主要用法: 单纯先定义一个变量出现 作为模板实参 int main() { auto pf = malloc; auto pf1 = pf; // decltype推出对象的类型,再定义变量,或者作为模板实参 // 单纯先定义一个变量出现 decltype B<decltype(x* y)> bb2; } 三.nullptr——表示空指针 由于C++中NULL被定义成字面量0,因为0既能指针常量,又能表示整形常量。
,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。 而编译时类型推导,除了我们说过的auto关键字,还有本文的decltype。 decltype与auto关键字一样,用于进行编译时类型推导,不过它与auto还是有一些区别的。 decltype的类型推导并不是像auto一样是从变量声明的初始化表达式获得变量的类型,而是总是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值。 (rg) rg1 = g; // 引用 const 变量 decltype(rg) rg2 = 1; // 引动常量 // decltype(rg) rg3; // err, 必须初始化 // 5-与指针结合 的使用注意 C++14 取消 decltype ---- 参考博客:c++标准14取消decltype推算函数返回类型 其他 ---- typeid().name() 返回值 C++里auto
auto auto让编译器通过初始值来推算变量的类型——–因此,auto定义的变量必须有初始值. 1.让引用对象作为初始值 ————————————–使用引用其实是使用引用的对象 int i=0,&c=i; auto a=c;//a是int型变量 2.auto与引用 ————————————一般来说,auto会忽略顶层const. const int i=0,&j=i; auto a=i; //a是一个int(而非const) auto b=j 底层const 因此,当我们希望推断出来的auto是顶层const时,需要明确指出 const auto c=i; ————————————将引用的类型设置为auto,顶层const属性仍将保留 /错误,这里cr为 const int , p对应的auto为 int decltype 有的时候我们想用一个表达式的值推算出要定义变量的类型,但是又不想用该表达式的值初始化变量,这个时候可以选择decltype
1. auto关键字 1.1 auto介绍 早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动储存器的局部变量。 C++11中,标准委员会赋予了auto全新的含义即:auto 不再是一个存储类型指示符,而是作为一个新的类型 指示符来指示编译器, auto 声明的变量必须由编译器在编译时期推导而得。 1.2 auto使用细则 1.2.1 auto与指针、引用 int main() { int x = 10; auto y = &x; auto z = x; auto& r = x; 声明指针类型时,auto和auto*没有区别;但是如果是声明引用,必须使用antu&: 1.2.2 同行声明多个变量 int main() { auto a = 10, b = 20; auto c : 1.3 auto不能推导的场景 1.3.1 auto不能作为函数的参数 此处编译失败,auto不能作为函数的形参,因为编译器无法对val的实际类型进行推导。