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推导规则的更多相关文章

  1. c++11 auto 与 decltype 详解

    转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题 ...

  2. C++11 auto and decltype

    1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:aut ...

  3. c++11——auto,decltype类型推导

    c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率.     auto和decltype的类型推导都是编译器在 ...

  4. C++ 11 学习1:类型自动推导 auto和decltype

    Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...

  5. C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则

    背景:    最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言:     ...

  6. 【C++】C++11的auto和decltype关键字

    转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...

  7. C++11新特性— auto 和 decltype 区别和联系

    一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准 ...

  8. Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype

    条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声 ...

  9. C++ 11 新特性: auto 和 decltype 区别和联系

    一. auto简介编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就 ...

随机推荐

  1. qq在线客服代码

    http://wpa.qq.com/msgrd?v=3&uin=1456262869&site=www.cactussoft.cn&menu=yes

  2. 【bzoj1345】[Baltic2007]序列问题Sequence

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1345 因为合并的花费是较大数的权值,所以每个数肯定是和附近的小数合并完后才与大数合并, ...

  3. Spring初学之annotation实现AOP前置通知和后置通知

    实现两个整数的加减乘除,并在每个计算前后打印出日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...

  4. JavaScrip 原生多文件上传及预览 兼容多浏览器

    JavaScrip 原生多文件上传及预览 兼容多浏览器 html代码块 <div class="container"> <label>请选择一个图像文件:& ...

  5. jsonp 解决跨域传输

    JSONP是JSON with Padding的略称.它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅 ...

  6. 团队小组NABCD(通用作业和个人作业)特点

    NABCD框架(通用作业和个人作业): N(need,需求): 你的创意解决了用户的什么需求? 使用户能够很好的区分作业情况,将班里所有同学的作业和自己私人的作业分开,通用作业指在一个班一同上课的公共 ...

  7. ViewPager渲染背景颜色渐变(引导页)--第三方开源--ColorAnimationView

    下载地址:https://github.com/TaurusXi/GuideBackgroundColorAnimation 使用方法如下: <FrameLayout xmlns:android ...

  8. centos下 yum安装ngix

    1.CentOS 6,先执行:rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6. ...

  9. CI框架后台添加左侧导航栏出现的一系列问题

  10. 【LeetCode】025. Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k  ...