我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行。RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称。同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值。RTTI会导致运行时效率降低,且在泛型编程中,我们更需要的是编译时就要确定类型,RTTI并无法满足这样的要求。编译时类型推导的出现正是为了泛型编程,在非泛型编程中,我们的类型都是确定的,根本不需要再进行推导。
decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
auto 和 decltype 是 C++11 引入的两个关键字,用于进行类型推导和获取表达式的类型信息。它们的作用和用法如下:
一是一些类型难于“拼写”,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。
在中,我介绍了auto的用法及其实际编程中的应用,既然auto可以推导变量的类型,为什么C++11还引进decltype类型说明符呢?关于这一点,C++ Primer中这样写道:有时希望从表达式的类型推断出要定义的变量的类型(这一点auto可以做到),但是不想用该表达式的值初始化变量(auto依赖这一点才能推导类型)。如果你还是不明白,请开下面的例子:
条款3 了解decltype decltype是一个有趣的东西,给它一个变量名或是一个表达式,decltype会告诉你这个变量名或是这个表达式的类型,通常,告诉你的结果和你预测的是一样的,但是偶尔的结果也会让你挠头思考,开始找一些参考资料进行研究,或是在网上寻找答案。 我们从典型的例子开始,因为它的结果都是在我们预料之中的,和模板类型推导与auto类型推导相比(参见条款1和条款2),decltype几乎总是总是返回变量名或是表达式的类型而不会进行任何的修改 const int i = 0;
如果想要知道一个表达式的数据类型但又不想对表达式进行求值, 那么auto似乎就不满足这中要求, c++11加入了decltype操作符,它的功能与auto类似, 都是进行类型推导, 但是decltype就能对某一表达式的类型进行推导并且不求表达式的值.
decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,auto推导的表达式放在“=”的右边,并作为auto所定义的变量的初始值,而decltype是和表达式结合在一起,语法如下:
大家好,又见面了,我是你们的朋友全栈君。 decltype与auto关键字一样,用于进行编译时类型推导。 decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,例如:
decltype(declare type)用于查询表达式的类型,即编译时期进行自动类型推导。如上所示,该语句返回expression表达式的类型。
在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int、char 等;但是在一些比较灵活的语言中,比如 C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体的类型,而是让编译器(或者解释器)自己去推导,这就让代码的编写更加方便。
想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用decltype 语法是:delctype(表达式),其中表达式可以是变量、函数、数组等。
在《不想写表达式的类型?试试auto吧》中介绍了自动类型推导,它需要有初始值,今天再来介绍一个C++11中的特性,decltype。
在以上的例子中,因为函数模板的存在,我们并不能知道变量xpy的类型。 这时我们可以使用C++11新增的关键字decltype
关键字decltype的作用是将变量的类型声明为表达式指定的类型。即将var的类型声明为expression指定的类型。编译器在处理decltype的时候,实际上需要对expression进行一个核对,然后才能确定var的类型。其流程和核对规则大致如下:
编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。
g++ -std=c++17 2.07.decltype.cpp -o decltype
decltype是C++11中引入的新的类型说明符。编译器根据分析表达式或者函数返回值来分析其类型。decltype的详细用法,请参考《C++中decltype的使用方法》
最近在恶补 C++ 知识的时候,学习到了一些 C++11 标准的新特性,利用这些新特性,我们能够更快地提高编程效率,从而实现我们的目标,在此特意记下学习过程中所学习到的一些东西,方便日后的回顾和复习。
案例二 #include <cassert> int main() { const int & a = 0; decltype(a) b = a; assert(&b == &a); }
现代的编程语言,不管是动态语言(JavaScript、Python 等),还是静态语言(Go、Rust 等),大都支持自动类型推导(type deduction)。
1、在C++中,decltype作为操作符,用于查询表达式的数据类型。decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题。泛型编程在整个1990年代越发流行,对实现类型推导机制的需求也应运而生。为此,许多编译器厂商都基于程序语言现有的功能,自行实现了这类操作符,其实现如typeof,以及一些功能有限,但更易移植的实现。2002年间,比雅尼·斯特劳斯特鲁普提议在C++内标准化这类操作符,并将之加入C++;且建议命之为“decltype”,以反映其具有获取表达式的“声明类型”(Declared Type)的功能。
类型别名 typedef关键字 typedef关键字是继承自C语言的特性,利用它我们可以为一个类型起别名,一般用于将复杂类型简化。举个简单的例子,将int类型定义为integer类型,之后就可以在代码
在《深入解析C++的auto自动类型推导》和《深入解析decltype和decltype(auto)》两篇文章中介绍了使用auto和decltype以及decltype和auto结合来自动推导类型的推导规则和用法,虽然确定类型的事情交给编译器去做了,但是在有的时候我们可能还是想知道编译器推导出来的类型具体是什么,下面就来介绍几种获取类型推导结果的方法,根据开发的不同阶段,你可以在不同阶段采用不同的方法,比如在编写代码时,编译代码时,代码运行时。
auto类别推导其实就是模板类别推导,只不过模板类别推导涉及模板、函数和形参,而auto和它们无关
1. Understand template type deduction. 函数模板的原型 template<typename T> void f(ParamType param); ParamType是一个左值引用或者指针时 template<typename T> void f(T& param); int x = 27; const int cx = x; const int& rx = x; f(x);// T是int,param类型是int& f(cx);// T是const int, p
C++在C++98标准中就部分支持动态类型了,C++98对动态类型支持就是C++中的运行时类型识别RTTI。
很久以前就知道C++11对我们课上讲的C++有很多改进的地方,当时也没有细学,最近一个偶然的机会陡然发现原来身边的同学好多都对C++11都颇有心得,推崇备至,回头想想在C++14,甚至C++17都不新鲜的现在,连C++11都不会的话显然有点说不过去了。。。于是呢我就打算利用最近闲着的时间,在补《人民的名义》的间隙顺便学学C++11应该也是极好的。
1 ParamType是一个指针或者引用(非通用universal reference引用)
auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用。在C++11中被赋予了新的含义和作用,用于类型推断。
前几天看了《C++11之美》受到一些启发,想到可以通过判断一个类型是否有指定的操作符(比如==,>=)。 基本的原理与文中的差不多,利用SFINAE原则,通过返回类型后置来推断表达式的类型,推断的过程中利用declval,它可以获取类型的右值引用,以便来调用==操作符,这个过程是在编译期完成的。 如果通过==操作符比较declval的右值引用成功了,则会继续推断逗号表达式的类型,最终推断的函数返回类型为bool; 如果通过==操作符比较declval的右值引用失败了,则推断失败,编译器会选择优先级最低的test(...)函数,它的返回类型为void。 我们最后判断实例化的test<T>(0)的返回值是否为bool,可以知道类型T是否存在==操作符。
返回类型后置 编译器通过初始化去顶auto代表的类型,不需要定义变量仅希望得到类型使用decltype
要注意的是,函数模板默认参数没有函数默认参数的默认参数都必须在右边的限制,想放哪就放哪
在C/C++中,左值(lvalue)和右值(rvalue)是用于规定表达式(expression)的性质。C++中表达式要不然是左值,要不然是右值。
一、格式 指针名前*号,并且将*和指针名用括号括起来 例如: //指针名为pf,指向一个返回值为bool,参数为两个const string&的函数bool (*pf)(const string&, const string&);//这个不是函数指针,而是一个返回值为bool*的pf函数bool *pf(const string&, const string&); 二、函数指针的赋值 可以直接将函数名赋值给函数指针,或者在函数名前加&符号都可以 bool lengthCompare(const strin
先从一个群友的一个实际的问题出发,我们来看看concept可以解决什么问题。是怎么样通过coding实现的。
g++ -std=c++17 2.01.nullptr.cpp -o nullptr.out
nullptr\text{nullptr}nullptr 的出现是为了取代 NULL\text{NULL}NULL,避免 NULL\text{NULL}NULL 的二义性。
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51113805
用于解耦,可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
之前写完了《C++Primer》的笔记,但是《C++Primer》已经是快十年的老书了,其包含的C++特性仅仅到C11为止,因此又去看了些C++14的特性,发现Anthony Calandra在https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP14.md 中有对C++14重要的新特性的简介,看完就翻译整理后发上来了。原文中有些地方写得不是很好理解所以对其做了少量修改。
auto是C语言的一个关键字,关键字主要用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。
QVariantMap转SkinConfig使用的是fromMap接口,而SkinConfig转QVariantMap使用的是toMap接口。 我们看看他们的实现:
介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省?2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.
领取专属 10元无门槛券
手把手带您无忧上云