C++11 新特性之 decltype关键字

decltype关键字用于查询表达式的类型。与其他特性结合起来之后会有意想不到的效果。

decltype的语法是

decltype (expression)

实例:

#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
	int i;
	double d;
	float f;
	struct A
	{
		int i;
		double d;
	};

	decltype(i) i1;
	cout << typeid(i1).name() << endl; //g++编译器下输出i ,对应int类型
	decltype(d) d1;
	cout << typeid(d1).name() << endl;//输出d, double
	decltype(f) f1;
	cout << typeid(f1).name() << endl;//输出f,float

	A *a = new A;
	decltype(a->i) i2;
	cout << typeid(i2).name() << endl; //输出i, int
	decltype(a->d) d2;
	cout << typeid(d2).name() << endl; //输出d,double
	return 0;
}

decltype在模板编程中的用处,举个例子,

template <class T, class U>
??? add(T t, U u)
{
	return t+u;
}

问题在于无法知道t+u返回的实际类型

解决方法:利用__typeof__扩展编写相当难看的代码

template <class T, class U>
__typeof__(*(T*)0 + *(U*)0) add(T t, U u)
{
	return t+u;
}

而在C++11中,我们可以使用auto关键字与decltype配合

#include <iostream>
#include <typeinfo>
using namespace std;

template <class T, class U>
auto add(T t, U u) ->decltype(t+u)
{
	return t+u;
}

int main()
{
	auto r = add(1, 1.0);
	cout << typeid(r).name() << endl;

	return 0;
}

C++11 新特性之 decltype关键字,布布扣,bubuko.com

时间: 2024-12-13 14:05:06

C++11 新特性之 decltype关键字的相关文章

c++11 新特性之 auto关键字

C++11是对目前C++语言的扩展和修正.C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. g++编译c++11命令加上 -std=c++11 C++11中引入auto第一种作用是为了自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作 auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响另外,似乎auto并不会影响编译速度,

C++11新标准:decltype关键字

一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值. 二.decltype用法 1.基本用法 int getSize(); int main(void) { int tempA = 2; /*1.dclTempA为int*/ declty

【C++11】30分钟了解C++11新特性

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decl

C++11新特性:自动类型推断和类型获取

声明:本文是在Alex Allain的文章http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-function.html的基础上写成的. 加入了很多个人的理解,不是翻译. 转载请注明出处 http://blog.csdn.net/srzhz/article/details/7934483 自动类型推断 当编译器能够在一个变量的声明时候就推断出它的类型,那么你就能够用auto关键字来作为他们的类型: [c

Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以大大简化我们的编程工作.auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响.另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配.如果没有auto关键字 写个迭代器要写很长长,这也算是节省了我们的脑细胞吧,~~~~(>_<)~~~~ !! auto a; /

关注C++细节——C++11新标准之decltype的使用注意

c++11新特性--decltype decltype是C++11添加的一个新的关键字,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值. 对于内置类型的对象,使用decltype很直观,但当参数为复合类型的时候就应该注意一些使用细节问题. 1.当decltype作用于数组的时候就应该小心了,本文作者(CSDN   iaccepted). intiarr[10] = {0}; decltype(iarr)ib; 这个时候ib的定义等价于

C++培训 C++11新特性:杂项

C++培训之前小编给大家总结了一些C++的新特性,这一篇文章是介绍的C++11新特性之杂项,在后面的文章中,小编还会给大家总结一些C++11新特性的知识出来! 类型别名声明 类似typedef,新标准中可以使用using为类型声明一个别名(alias). std::cout<<"test using alias:\n"; using HT = double; using NAME = std::string; HT h = 1.78; NAME name = "R

C++11新特性总结 (一)

1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++11的比较好的书籍.这篇文章仅总结关于C++11中的新东西,老的东西不再赘述.本文的所有代码仅仅值列出关键代码,并且所有特性都已经用编译器验证过,我的编译环境 gcc 5.3.1  g++ 5.3.1 ,据说 4.7以上的版本已经支持大部分C++11的特性,VS系列的编译器对C++11的支持情况不甚了

C++:C++11新特性超详细版(1)

前言: 虽然目前没有编译器能够完全实现C++11,但这并不意味着我们不需要了解,学习它.深入学习C++11,你会发现这根本就是一门新的语言,它解决了c++98中许多遗留下来的问题.早晚会有一天,C++11便会普及大部分编译器.因此,提早做些准备也是应该的. 在此我想做一个关于C++11的专题,将C++11的新特性进行一一讲解,以通俗易懂的语言及例子帮助读者入门C++11.本文便是C++11新特性超详细版系列文章的第一篇, 即C++:[C++11]新特性超详细版(1). 不过我要强调的是,这些文章