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++ 11 游记 1(decltype constexpr)

一. 结缘 decltype

參考source

上code

  1. #include <iostream>
  2. struct A {
  3. double x;
  4. };
  5. const A* a = new A();
  6. decltype( a->x ) x3; // type of x3 is double (declared type)
  7. decltype((a->x)) x4 = x3; // type of x4 is const double& (lvalue expression)
  8. template <class T, class U>
  9. auto add(T t, U u) -> decltype(t + u); // return type depends on template parameters
  10. int main()
  11. {
  12. int i = 33;
  13. decltype(i) j = i*2;
  14. std::cout << "i = " << i << ", "
  15. << "j = " << j << '\n';
  16. auto f = [](int a, int b) -> int {
  17. return a*b;
  18. };
  19. decltype(f) f2{f}; // the type of a lambda function is unique and unnamed
  20. i = f(2, 2);
  21. j = f2(3, 3);
  22. std::cout << "i = " << i << ", "
  23. << "j = " << j << '\n';
  24. }

初步心得

此论要点:

- 初步掌握四种情形,具体看代码

- 函数后置的返回类型

- 变量(无括号的)申明

- 变量(有括号的)申明

- 和Lamda表达式相关

-

- 须要注意的是。假设一个对象的名称加上括号,它成为左值表达式

  • 他还是lamda表达式的好基友喔。

    decltype is useful when declaring types that are difficult or impossible to declare using standard notation, like lambda-related types or types that depend on template parameters.

尝试难点

If expression is a function call which returns a prvalue of class type or is a comma expression whose right operand is such a function call, a temporary object is not introduced for that prvalue. The class type need not be complete or have an available destructor. This rule doesn’t apply to sub-expressions:in decltype(f(g())), g() must have a complete type, but f() need not.

debug情况

我试着改变lamda表达式中的參数。可是编译器提示我。不能通过,原因待查明

二. constexpr

  • 首先了解字面值 LiteralType,经常使用语字符串

  • 能够在编译时期被动地计算表达式的值

  • constexpr 将编译期常量概念延伸至括用户自己定义常量以及常量函数,其值的不可改动性由编译器保证。因而constexpr 表达式是一般化的。受保证的常量表达式

    比const 前置修饰的函数 的能力 更广

code from csdn

  1. enum Flags { good=0, fail=1, bad=2, eof=4 };
  2. constexpr int operator|(Flags f1, Flags f2)
  3. { return Flags(int(f1)|int(f2)); }
  4. void f(Flags x)
  5. {
  6. switch (x) {
  7. case bad: /* … */ break;
  8. case eof: /* … */ break;
  9. case bad|eof: /* … */ break;
  10. default: /* … */ break;
  11. }
  12. }
  13. constexpr int x1 = bad|eof; // ok
  14. void f(Flags f3)
  15. {
  16. // 错误:由于f3不是常量,所以无法在编译时期计算这个表达式的结果值
  17. constexpr int x2 = bad|f3;
  18. int x3 = bad|f3; // ok。能够在执行时计算
  19. }

code from cpp.com

  1. #include <iostream>
  2. #include <stdexcept>
  3. // The C++11 constexpr functions use recursion rather than iteration
  4. // (C++14 constexpr functions may use local variables and loops)
  5. constexpr int factorial(int n)
  6. {
  7. return n <= 1 ? 1 : (n * factorial(n-1));
  8. }
  9. // literal class
  10. class conststr {
  11. const char * p;
  12. std::size_t sz;
  13. public:
  14. template<std::size_t N>
  15. constexpr conststr(const char(&a)[N]) : p(a), sz(N-1) {}
  16. // constexpr functions signal errors by throwing exceptions
  17. // in C++11, they must do so from the conditional operator ?:
  18. constexpr char operator[](std::size_t n) const {
  19. return n < sz ?
  20. p[n] : throw std::out_of_range("");
  21. }
  22. constexpr std::size_t size() const { return sz; }
  23. };
  24. // C++11 constexpr functions had to put everything in a single return statement
  25. // (C++14 doesn't have that requirement)
  26. constexpr std::size_t countlower(conststr s, std::size_t n = 0,
  27. std::size_t c = 0) {
  28. return n == s.size() ? c :
  29. s[n] >= 'a' && s[n] <= 'z' ?
  30. countlower(s, n+1, c+1) :
  31. countlower(s, n+1, c);
  32. }
  33. // output function that requires a compile-time constant, for testing
  34. template<int n> struct constN {
  35. constN() { std::cout << n << '\n'; }
  36. };
  37. int main()
  38. {
  39. std::cout << "4! = " ;
  40. constN<factorial(4)> out1; // computed at compile time
  41. volatile int k = 8; // disallow optimization using volatile
  42. std::cout << k << "! = " << factorial(k) << '\n'; // computed at run time
  43. std::cout << "Number of lowercase letters in \"Hello, world!\" is ";
  44. constN<countlower("Hello, world!")> out2; // implicitly converted to conststr
  45. }

心得

  • 迭代函数的值 在编译期间计算得到!!

    !!

  • 还有就是下图,具体例如以下:

三.其它:好资料

scott meyer 讲cpp11

C++11 FAQ中文版:常量表达式(constexpr)

cpp 我觉得最好资料之中的一个

c++ 11 游记 之 decltype constexpr的更多相关文章

  1. C++11特性:decltype关键字

    decltype简介 我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应ty ...

  2. C++11新特性--decltype (转)

    返回值 decltype(表达式) [返回值的类型是表达式参数的类型] 这个可也用来决定表达式的类型,就像Bjarne暗示的一样,如果我们需要去初始化某种类型的变量,auto是最简单的选择,但是如果我 ...

  3. c++11 auto 与 decltype 详解

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

  4. C++11 类型推导decltype

    我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通 ...

  5. C++11 auto and decltype

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

  6. C++ 11 Template ... 与Decltype 测试

    #include <iostream> #include "string" using namespace std; template<typename T> ...

  7. C++11 auto和decltype推导规则

    VS2015下测试: decltype: class Foo {}; int &func_int_r(void) { int i = 0; return i; }; int && ...

  8. C++11新标准:constexpr关键字

    一.constexpr意义 将变量声明为constexpr类型以便由编译器来验证变量是否是一个常量表达式(不会改变,在编译过程中就能得到计算结果的表达式).是一种比const更强的约束,这样可以得到更 ...

  9. C++11常用特性介绍——constexpr变量

    一.constexpr变量 1)将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,如: in ...

随机推荐

  1. [Go] sync.Pool 的实现原理 和 适用场景

    摘录一: Go 1.3 的 sync 包中加入一个新特性:Pool. 官方文档可以看这里 http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以 ...

  2. SVN的管理方式和git的管理方式

    SVN是集中式的管理方式.大致流程如下: 1.从服务器上将整个项目代码检出到本地电脑硬盘中(一般来说,是从主分支上下载的代码).2.然后在svn服务器中建立新的开发分支,将硬盘中的代码提交到该开发分支 ...

  3. 委托、Lambda表达式、事件系列03,从委托到Lamda表达式

    在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal ...

  4. Delphi判断文件是否正在被使用

    首先,我们先来认识下CreateFile函数,它的原型如下   HANDLE CreateFile( LPCTSTR lpFileName,    //指向文件名的指针 DWORD dwDesired ...

  5. Delphi开发环境中应用层网络协议的实现

    已经进入Internet网络时代了,许多新出的软件都拥有网络功能.其实,在这些软件背后所依靠的技术基础就是一系列的Inernet网络协议标准,亦即TCP/IP系列协议. 下面本人简要介绍一下在Delp ...

  6. windows nginx出现 was not signaled for 5s的看过来

    windows下 nginx 配置ssl的key是不能存储密码的,否则启动时会提示输入密码 输入后也启动不起来,会报错: 2011/04/18 09:49:09 [alert] 1992#4548: ...

  7. 关于struts2种的action运行两次,或多次,或反复运行的bug

    今天在做项目的时候发现一个bug,就是action会莫名其妙的运行两次.网上搜了非常多帖子,关于这个问题也得到了一些处理方法,可是没有我想要的,造成运行两次活多次的问题呢,有非常多种原因,我在这里仅仅 ...

  8. 分布式系统:CAP

    一致不太理解CAP,最近好像有点感觉了,这里写下来,先介绍下CAP的定义: C:一致性.写完数据后,立马能看到最新数据. A:可用性.所有请求必须有响应. P:分区容错性.网络或服务器故障不会导致系统 ...

  9. log4j生成有日期的日志文件名

    有任务需求,需要输出日志为 文件名+日期格式作为文件保存. 解决方法很简单: log4j.appender.file=org.apache.log4j.DailyRollingFileAppender ...

  10. Weblogic跨域session冲突解决办法

    一.现象: 在WebLogic中,有两个不同域A(端口:9000)和B(端口:8000),应用CA在域A中,应用CB在域B中,进行如下操作: 1.先登录应用CA,再登录应用CB,然后,切换回应用CA, ...