C++11 auto和decltype推导规则
VS2015下测试:
decltype:
class Foo {};
int &func_int_r(void) { int i = 0; return i; };
int &&func_int_rr(void) { return 0; };
int func_int(void) { return 0; };
const int &func_cint_r(void) { int i = 0; return i; };
const int &&func_cint_rr(void) { return 0; };
const int func_cint(void) { return 0; };
const Foo func_cfoo(void) { return Foo(); };
int main()
{
{
int x = 0;
decltype(func_int_r()) al = x; // al -> int &
decltype(func_int_rr()) bl = 0; // bl -> int &&
decltype(func_int()) cl = 0; // cl -> int
decltype(func_cint_r()) a2 = x; // a2 -> const int &
decltype(func_cint_rr()) b2 = 0; // b2 -> const int &&
decltype(func_cint()) c2 = 0; // c2 -> int
decltype(func_cfoo()) d2 = Foo(); // d2 -> Foo
decltype((x)) t = x; // t -> int &
decltype(x + 1) t2; // t2 -> int 表达式
decltype(++x) t3 = x; // t3 -> int & 表达式返回左值 decltype((++x)) t4 = x; // t6 -> int &
decltype((1)) t5 = x; // t4 -> int
decltype(1) t6 = x; // t5 -> int
int i = 0;
}
system("pause");
return 0;
}
- 当函数返回的是右值时,decltype会摒弃cv操作符。c2,d2
- 当标识符加上()后,decltype结果为左值引用。t,t4
- 当表达式赋值给左值时,decltype结果为左值引用。t3
-其它按简单推导即可。
应用:
template<class ContainerT>
class Foo
{
typename ContainerT::iterator it_; //类型定义可能有问题
public:
void func(ContainerT& container)
{
it_ = container.begin();
}
};
int main()
{
typedef const vector<int> container_t;
container_t arr;
Foo<container_t> foo;
foo.func(arr);
system("pause");
return 0;
}
编译时报错,因为当ContainerT是一个const时,it_应该是const_iterator;解决方法:
template<class ContainerT>
class Foo
{
private:
//decltype(ContainerT()::begin());//在vs2015中,ContainerT()会被推导为vector<int>类型,const被摒弃,所以出错。
static ContainerT gi;
decltype(gi.begin()) it_; //不会执行表达式,只会推导,跟auto不同
public:
void func(ContainerT& container)
{
decltype(ContainerT()) tt;
it_ =container.begin();
int i = 0;
}
};
int main()
{
using container_t= const vector<int> ;
container_t arr;
Foo<container_t> foo;
foo.func(arr);
system("pause");
return 0;
}
返回类型后置语法:
template<typename U,typename R>
auto add(U u, R r)->decltype(u + r)
{
return u + r;
}
int main()
{
cout << add(100, 100.0f) << endl;
cout<<add<int,float>(100, 100.0f) << endl;
system("pause");
return 0;
}
auto:
- 当auto后面显式添加&时,才会保留表达式cv限定符和引用。
- 当auto推导结果为指针时,保留cv操作符。
- 其它情况不保留cv限定符和引用。
int main()
{
int x = 0;
const auto* a = &x; // a -> const int *
auto b = &x; // b -> int *
auto &c = x; // c -> int &
auto d = c; // d -> int
const auto e = x; // e -> const int
auto f = e; // f -> int
const auto& g = x; // g -> const int &
auto& h = g; // h -> const int &
const auto i = g; // i -> const int
auto j = a; // j -> const int *
const int ci = i, &cr = ci;
auto d1 = &i; // d1 -> const int *
auto e1 = &ci; // e1 -> const int *
system("pause");
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++11 auto和decltype推导规则的更多相关文章
- c++11 auto 与 decltype 详解
转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题 ...
- C++11 auto and decltype
1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:aut ...
- c++11——auto,decltype类型推导
c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率. auto和decltype的类型推导都是编译器在 ...
- C++ 11 学习1:类型自动推导 auto和decltype
Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...
- C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则
背景: 最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言: ...
- 【C++】C++11的auto和decltype关键字
转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...
- C++11新特性— auto 和 decltype 区别和联系
一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准 ...
- Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype
条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声 ...
- C++ 11 新特性: auto 和 decltype 区别和联系
一. auto简介编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就 ...
随机推荐
- Android 开发人员必须掌握的 10 个开发工具
Android 开发人员必须掌握的 10 个开发工具 Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. ...
- SpringMVC的AJAX请求报406错误
SpringMVC的AJAX请求报406错误原因有两种:1.jackson包没有引入 2.如果已经引入jackson包了还报406的错误,那么就有可能是请求的url路径是.html结尾,但是返回的数据 ...
- Elasticsearch6.4.3安装
Linux内存一定要1g以上! 首先要有jdk环境 要求1.8版本以上 elasticsearch是Java写的 将上传的 elasticSearch安装包解压 cd /home/elastics ...
- MySQL使用FEDERATED engine建立代理表
CREATE TABLE `yndzm` ( `city` varchar(40) DEFAULT NULL COMMENT '市(州)', `county` varchar(60) DEFAULT ...
- 【P2361】yyy棋(博弈论+贪心+模拟)
这个题看上去本来不好处理,然而善意的题面已经基本告诉你做法了,小时候玩的那个游戏就是代码的核心.动动脑子想想,如果长和宽的积是奇数,那么一定要先手,如果是偶数,那么后手就会获胜. 好了,那么怎么处理对 ...
- python机器学习——分词
使用jieba库进行分词 安装jieba就不说了,自行百度! import jieba 将标题分词,并转为list seg_list = list(jieba.cut(result.get(" ...
- window7 共享wifi(不通过wifi软件)
1.新建共享网络账号 管理员登录cmd输入:netsh wlan set hostednetwork mode=allow ssid=4Gtest key=12345678 ssid是无线网络名称.k ...
- ML 线性回归Linear Regression
线性回归 Linear Regression MOOC机器学习课程学习笔记 1 单变量线性回归Linear Regression with One Variable 1.1 模型表达Model Rep ...
- Elasticsearch Suggester 学习
suggester搜索就像百度搜索框中的提示类似. Elasticsearch 中提供类似的搜索功能. 答案就在Suggesters API. Suggesters基本的运作原理是将输入的文本分解为t ...
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
1. 如图客户端连接server后,server发送"hello tcp" 给客户端 2. 实例代码 ----------------------------------- s ...