C++——decltype】的更多相关文章

decltype简介 我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称.同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值.RTTI会导致运行时效率降低,且在泛型编程中,我们更需要的是编译时就要确定类型,RTTI并无法满足这样的要求.编译时类型推导的出现正是为了泛型编程,…
1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:auto i = 0 :编译器会通过“0”值,推导出变量i是整型. 如果初始值是引用,如: [cpp] view plain copy   int i = 4; int &ri = i; auto ai = ri; 通过应用是利用了ri指向的对象,所以ai的类型是int.也就是ai与i的类型是相同的. 另…
#include <iostream> #include "string" using namespace std; template<typename T> void func_one(T& val) { cout << val << endl << "finished"; } //不可用 template< typename T, typename... Args> auto fun…
前言:因为公司现在使用vs2008,所以很多c++11的新特性还未能使用,导致写了很多冤枉代码. 最初引擎的数学库非常简单,使用起来也不方便,例如: float FastLerp(const float& a, const float& b, float t); vec2f FastLerp(const vec2f& a, const vec2f& b, float t); vec3f FastLerp(const vec3f& a, const vec3f&…
今天搜狗笔试的一道选择题,原题给忘了,但记得所考的知识点.知识点很基础,但很容易忽视. 具体内容可参考C++ Primer. auto :变量取auto后,其所对应的类型        auto一般会忽视顶层const,保留底层const.但如果将引用类型设为const,则会保留相应的顶层const.下面是C++ Primer书 中的例题,我给出了相应的标注.个人觉得比较容易犯错的地方是对常量对象取地址和对引用加auto. int main() { /* int i = 0, &r = i; a…
在C++中,decltype作为操作符,用于查询表达式的数据类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题. 泛型编程在整个1990年代越发流行,对实现类型推导机制的需求也应运而生.为此,许多编译器厂商都基于程序语言现有的功能,自行实现了这类操作符,其实现如typeof,以及一些功能有限,但更易移植的实现.2002年间,比雅尼·斯特劳斯特鲁普提议在C++内标准化这类操作符,并将之加入C++:…
条款3 了解decltype decltype是一个有趣的东西,给它一个变量名或是一个表达式,decltype会告诉你这个变量名或是这个表达式的类型,通常,告诉你的结果和你预测的是一样的,但是偶尔的结果也会让你挠头思考,开始找一些参考资料进行研究,或是在网上寻找答案. 我们从典型的例子开始,因为它的结果都是在我们预料之中的,和模板类型推导与auto类型推导相比(参见条款1和条款2),decltype几乎总是总是返回变量名或是表达式的类型而不会进行任何的修改 ; // decltype(i)是co…
auto 1.编译器通过分析表达式的类型来确定变量的类型,所以auto定义的变量必须有初始值. auto i=; //ok,i为整型 auto j; //error,定义时必须初始化. j=;     2.auto可以在一条语句中声明多个变量,但该语句中所有变量的初始值类型必须有一样. auto i=,*P=&i; //ok,i是整数,p是整型指针 auto a=,b=3.14; //error,a和b类型不一致 3.auto会忽略掉顶层const,同时底层const则会保留下来 ,&b=…
decltype作用是选择并返回操作数的数据类型. decltype(f()) sum = x; // sum的类型就是函数f的返回类型 如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和const在内): , &cj = ci; decltype(ci) x = ; // x的类型是const int decltype(cj) y = x; // y的类型是const int&,y绑定到变量x decltype(cj) z; // 错误,…
auto会忽略顶层const,保留底层const ; const int* const p = &i; auto p2 = p; //p2是const int*,不是const int* const //*p2 = 4; //错误,p指向常量 p2 = nullptr; //正确,p2本身不是常量 auto不会保留引用类型,应该使用auto& int& x = i; auto m = x; //m是int,不是int& auto& n = x; //n是int&am…
在C++中,decltype作为操作符,用于查询表达式的数据类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题. 泛型编程在整个1990年代越发流行,对实现类型推导机制的需求也应运而生.为此,许多编译器厂商都基于程序语言现有的功能,自行实现了这类操作符,其实现如typeof,以及一些功能有限,但更易移植的实现.2002年间,比雅尼·斯特劳斯特鲁普提议在C++内标准化这类操作符,并将之加入C++:…
红色字体为个人推断,可信度自辨. 蓝色字体为重点. auto类型说明符:使用auto时,编译器会分析表达式,并自动推算出变量所属类型.*auto变量必须有初值 原理:编译器通过 初值 来判断auto变量所属类型.具体匹配规则不清.但整形和浮点推断为int和double. 需要注意: 1)auto sz = 0, pi = 3.14;  // 错误.sz和pi的类型不一致. decltype类型指示符:得到表达式对应类型. 使用时机: 1)需要表达式对应类型,但不需要表达式的值. 2)需要函数返回…
条款三 了解decltype 基础知识 提供一个变量或者表达式,decltype会返回其类型,但是返回的内容会使人感到奇怪. 以下是一些简单的推断类型: ; // decltype(i) -> const int bool f(const Widget& w); // decltype(w) -> const Widget&, decltype(f) -> bool(const Widget&) struct Point { int x, y; } // decl…
Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译器并不是完全支持,比如我正在使用的vs2012.这里是msdn里面VS各版本对C++ 11 的支持 对 C++11 功能的支持(现代 C++) 1.auto auto这个关键字C++原先就有,用来指定存储器.因为很少有人去用这个东西,所以在C++11中就把原有的auto功能给废弃掉了,而变成了现在的…
关于decltype操作符的说明: 1.在C++中,decltype作为操作符,用于查询表达式的数据类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题.泛型编程在整个1990年代越发流行,对实现类型推导机制的需求也应运而生.为此,许多编译器厂商都基于程序语言现有的功能,自行实现了这类操作符,其实现如typeof,以及一些功能有限,但更易移植的实现.2002年间,比雅尼·斯特劳斯特鲁普提议在C++…
C++11 终于加入了自动类型推导.以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用"原生态"的自动类型推导了! C++引入自动的类型推导,并不是在向动态语言(强类型语言又称静态类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行.例如C/C++/Java:弱类型语言又称动态类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的).例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScri…
论decltype和auto的区别   decltype和auto的区别 ①对引用变量的不同之处:auto将引用变量赋给变量后,变量的类型为引用变量所对应的变量的类型.而decltype则是为引用类型.例子如下: int i = 0,&r = i; //same auto a = i; decltype (i)b = i; //different auto c = r; c为int 类型 decltype (r)d = r;//d为int &类型 ②处理底层const的方式不同 auto一…
C++11新标准引入第二种类型说明符decltype,它的作用是选择并返回操作数的数据类型. 编译器分析表达式并得到它的类型,却不实际计算表达式的值: decltype(f()) sum = x;//sum的类型就是函数f的返回类型 编译器并不实际调用函数f,而是使用当调用发生时f的返回值类型作为sum的类型. decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内): , &cj = ci; decltype(ci) x = ;//x的类型是c…
程序清单8.1(inline内联函数) #include<iostream> using namespace std; inline double square(double x) {//inline表示内联函数 return x*x; } void main() { double a, b, c = 13.0; a = square(5.0); b = square(4.5+7.5); cout << "a=" << a << &quo…
一, auto 1, auto的作用     一般来说, 在把一个表达式或者函数的返回值赋给一个对象的时候, 我们必须要知道这个表达式的返回类型, 但是有的时候我们很难或者无法知道这个表达式或者函数的返回类型. 这个时候, 我们就可以使用auto关键字来让编译器帮助我们分析表达式或者函数所属的类型. 比如: 1 2 auto item = val1 + val2; auto red = LayerColor::create(Color4B(255, 100, 100, 255), 200, 10…
返回值 decltype(表达式) [返回值的类型是表达式参数的类型] 这个可也用来决定表达式的类型,就像Bjarne暗示的一样,如果我们需要去初始化某种类型的变量,auto是最简单的选择,但是如果我们所需的类型不是一个变量,例如返回值这时我们可也试一下decltype. 现在我们回看一些例子我们先前做过的, template <class U, class V> void Somefunction(U u, V v) { result = u*v;//now what type would…
typedef 类型别名(type alias)是一个名字,使用typedef不会真正地创建一种新的数据类型,它只是已经存在数据类型的一个新名称.语法: typedef type name; 其中type是c++中的数据类型,name是这个类型的一个别名. C++11提供了引用的功能,关于引用的详细介绍可以参考笔者之前的文章.引用为变量提供别名,typedef则是为类型提供别名. 例如: #include <iostream> int main(){ ;//使用int定义变量m typedef…
decltype((variable))总是引用类型,但是decltype(variable)只有当variable是引用类型时才是引用类型. #include <iostream> #include <typeinfo> using std::cin; using std::cout; using std::endl; auto f(auto x) { ;} auto f(auto x,auto y)->decltype(y){ return x-y; } double f…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 decltype是一个奇怪的东西.给出一个名字或者一个表达式,decltype可以告诉你名字或表达式的类型.大多情况下,他告诉你的就是确实你想的那样.但是偶尔,他会提供一个脱离你想象的结果,这导致了你必须去找一本参考书或者去在线Q&A网站寻求答案. 我们从一般情况(没有意外的结果)开始.对比template和auto的类型推导,decltype模仿你给的名字或表达…
 现代C++之理解decltype decltype用于生成变量名或者表达式的类型,其生成的结果有的是显而易见的,可以预测的,容易理解,有些则不容易理解.大多数情况下,与使用模板和auto时进行的类型推断相比,decltype作用于变量名或者表达式只是重复了一次变量名或者表达式的确切类型: const int i = 0; // decltype(i) 为 const int bool f(const Widget& w); // decltype(w) 为 const Widget& /…
转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型.和原来那些只对应某种特定的类型说明符(例如 int)不同.auto 让编译器通过初始值来进行类型推演.从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值. //由val_1 和val_2相加的结…
int* a = new int(10); decltype(*a) 得到的是引用类型:int&…
1.auto 1)auto是一个类型说明符(类型说明符就是像int.double这样的),用来定义一个变量,它可以让编译器去分析表达式的类型,并使用该表达式的值去初始化变量 //auto定义的变量必须有初始值 , v2 = ; auto item = v1 + v2;//编译器根据v1和v2相加的结果推断item的类型,并完成对item的初始化 2.dectype 1)dectype也是一个类型说明符,但它只让编译器去分析表达式的类型,并不用该表达式的值去初始化变量 ; decltype(cj)…
c++11 decltype decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题.decltype无法在派生类声明和析构函数调用中使用.类似于sizeof操作符,decltype也不需对其操作数求值.粗略来说,decltype(e)返回类型前,进行了如下推导:  若表达式…
title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:1307316一九六八(仅接受短信) 声明:本文採用下面协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 .转载请注明作者及出处. tips for image: http://7xjs3n.com1.z0.glb.clouddn.com c+…