c++11 常量表达式

c++11 常量表达式

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>

/**
 * 常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。
 * 这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时都计算。
 */

/*
constexpr函数的限制:
函数中只能有一个return语句(有极少特例)
函数必须返回值(不能是void函数)
在使用前必须已有定义
return返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式
*/
constexpr int GetConst()
{
    return 3;
}
//err,函数中只能有一个return语句
constexpr int data()
{
    constexpr int i = 1;
    return i;
}
constexpr int data2()
{
    //一个constexpr函数,只允许包含一行可执行代码
    //但允许包含typedef、 using 指令、静态断言等。
    static_assert(1, "fail");
    return 100;
}

int a = 3;
constexpr int data3()
{
    return a;//err, return返回语句表达式中不能使用非常量表达式的函数、全局数据
}

/*
常量表达式的构造函数有以下限制:
函数体必须为空
初始化列表只能由常量表达式来赋值
*/
struct Date
{
    constexpr Date(int y, int m, int d): year(y), month(m), day(d) {}

    constexpr int GetYear() { return year; }
    constexpr int GetMonth() { return month; }
    constexpr int GetDay() { return day; }

private:
    int year;
    int month;
    int day;
};

void mytest()
{
   int arr[GetConst()] = {0};
   enum {e1 = GetConst(), e2};

   constexpr int num = GetConst();

   constexpr int func(); //函数声明,定义放在该函数后面
   constexpr int c = func();  //err, 无法通过编译, 在使用前必须已有定义

   constexpr Date PRCfound {1949, 10, 1};
   constexpr int foundmonth = PRCfound.GetMonth();
   std::cout << foundmonth << std::endl;  // 10

    return;
}

constexpr int func()
{
    return 1;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
时间: 2024-11-14 00:53:10

c++11 常量表达式的相关文章

constexpr与常量表达式(c++11标准)

常量表达式(const expression):是指值不会改变并且在编译过程中就得到计算结果的表达式.(运行中得到结果的不能成为常量表达式). const int i=3;    //是一个常量表达式 const int j=i+1; //是一个常量表达式 int k=23;        //k的值可以改变,从而不是一个常量表达式 const int m=f(); //不是常量表达式,m的值只有在运行时才会获取. constexpr变量: C++11允许声明constexpr类型来由编译器检验

c++ 11学习笔记-- 常量表达式(constexpr)

最新在弄android ndk相关的,惊奇的发现最新的ndk10的版本已经gcc4.9了,我印象中,gcc4.8就支持C++0x11,14的支持,gcc再次走到了llvm的前面,LLVM最新的版本3.4.2应该只支持c++ 11,如果是同样的c++代码我一直认为llvm的效率会明显强过gcc. 废话不多说,让我们开始学习c++ 11吧,说实话我之前一直都很抗拒c++新的语法,感觉太难接受了,现在看来不熟悉也不行了. 常量表达式(constexpr) 常量表达式机制是为了: 提供了更多的通用的值不

C++11 Lambda表达式简单解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 很多语言都提供了 lambda 表达式,如 Python,Java 8 lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable

读书笔记:C++ Primer系列(11)—— 表达式

定义: 表达式(expression)是由一个或多个操作数(operand)通过操作符(operator)组合而成. 1. 操作符--除法(/)和求模(%) 注意: 除法和求模两种运算,操作数都必须是整型,包括:bool.char.short.int和long类型,以及对应的unsigned类型 如果两个操作数为正,除法和求模操作的结果也是正数或为零: 如果两个操作数为负,除法操作的结果为正数或为零,而求模的结果为负数或为零: 如果两个操作数,一个为正一个为负,除法和求模的结果取决于机器:如果求

Python Special Syntax 11: lambda表达式

lambdTesting=lambda x: x*3 print(lambdTesting(5)) 输出 15 像C#一样传递lambda表达式: def abc(t,a): return t(a) print(abc(lambdTesting,15)) 输出:45 Python Special Syntax 11: lambda表达式,布布扣,bubuko.com

C++11 lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capt

Android studio常量表达式的错误

今天在AS上集成Zxing的库,出现了如下的错误: 常量表达式的错误 这个错误是switch case的问题,提示换成if else 在AS中我们使用Alt+Enter(opt+Enter for Mac)快捷键直接将switch转换为if else,如下图所示: 在Tools Android的网站上有详细的说明,主要是避免多个库之间出现资源冲突 Non-constant Fields in Case Labels In a regular Android project, constants

C++11 Lambda 表达式

1. 匿名函数 匿名函数是一些拥有函数体,但没有函数名的函数.Lambda是一种与匿名函数相关的编程技术,但需要说明的是Lambda表达式得到的不是一个匿名函数,而是一个函数对象.MSDN:Lambda隐式定义函数对象类并构造该类类型的函数对象. 2. Lambda语法 C++11 Lambda 表达式

java 常量表达式

原文地址:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28 这是我翻译的,以备不时之用. 常量表达式是一个代表基本数据类型或者String数据类型的表达式,是在编译期间能计算出来的值.由以下几点组成: 基本数据类型或者String数据类型的字面值 转换成基本数据类型或者String(这点不是很理解) 一元操作符:+,-,~,and,!(但不包括++or--) 乘法操作符: *,/ 移位运算符: <<,&