c++11--常量表达式

1.常量表达式
1.1.引入背景

#include <iostream>

const int GetConst(){return 1;}
void Constless(int cond){
    //int arr[GetConst()] = {0};//err
    //enum{e1 = GetConst(), e2};//err
    switch(cond){
        //case GetConst()://err
            break;
        default:
            break;
    }
}

上述三处均无法使用GetConst(),因为const修饰的变量是运行期变量。
上述三处需要编译期常量。通过枚举,#define,字面常量可以得到编译期常量。

1.2.c++11引入constexpr
(1). 通过constexpr得到返回值是编译期常量的函数。

#include <iostream>

constexpr int GetConst(){return 1;}
void Constless(int cond){
    int arr[GetConst()] = {0};//ok
    enum{e1 = GetConst(), e2};//ok
    switch(cond){
        case GetConst()://ok
            break;
        default:
            break;
    }
}

使用constexpr修饰函数返回值时,对函数的要求:
a. 函数体只能包含单个语句,这个语句必须是return。
b. 函数必须有返回值(void不算)。
c. 当在编译期通过函数调用取得编译期常量处,函数定义需可见。
d. return中的表达式需要是常量表达式。(当一个表达式的所有参与成员均是常量表达式时这个表达式整体是常量表达式)。

(2).如何判断单个成员构成常量表达式:
单个成员是enum值,#define值,字面常量,constexpr修饰的变量时。
用constexpr修饰的变量必须使用常量表达式执行初始化。

(3).如何才能将自定义类型变量添加constexpr修饰

#include <iostream>

struct MyType{
    constexpr MyType(int x):i(x){}
    constexpr GetInt(){return i;}// 一个constexpr修饰的类型,其字段依然有constexpr性质。
    int i;
};

constexpr MyType mt = {0};
int main(){
    return 0;
}

需要为类型的构造函数添加constexpr修饰。
添加constexpr修饰的构造需满足:
a.函数体为空
b.接收的实参列表中每个实参需为常量表达式

(4). 模板推导下特殊处理说明

#include <iostream>
struct NotLiteral{
    NotLiteral(){i=5;}
    int i;
};

NotLiteral n1;
template<typename T>
constexpr T ConstExp(T t){
    return t;
}

void g(){
    NotLiteral n1;
    NotLiteral nl1 = ConstExp(n1);
    //constexpr NotLiteral n12 = ConstExp(n1);// err
    constexpr int a = ConstExp(1);
}

int main(){
    return 0;
}

上述模板函数ConstExp,预期返回值是常量表达式。
如果上述是一个非模板函数,则要求实参必须是常量表达式。
针对上述模板函数,做了特别处理:
实参是常量表达式时,返回值自然是常量表达式。
实参不是常量表达式时,不报错,返回值是非常量表达式。

相关推荐

  1. c++11--常量表达式

    2024-01-01 11:22:03       34 阅读
  2. Lambda 表达式C++11

    2024-01-01 11:22:03       6 阅读
  3. C++11:lambda表达式 & 包装器

    2024-01-01 11:22:03       13 阅读
  4. 10常用的正则表达式

    2024-01-01 11:22:03       29 阅读
  5. C++11:lambda表达式及function包装器

    2024-01-01 11:22:03       5 阅读
  6. 19章 正则表达式 - C++

    2024-01-01 11:22:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-01 11:22:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-01 11:22:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-01 11:22:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-01 11:22:03       18 阅读

热门阅读

  1. 关键字:final最终的

    2024-01-01 11:22:03       37 阅读
  2. go切片截取细节分析

    2024-01-01 11:22:03       31 阅读
  3. 人机对话--关于意识机器

    2024-01-01 11:22:03       33 阅读
  4. 《微信小程序开发从入门到实战》学习六十八

    2024-01-01 11:22:03       37 阅读
  5. React16源码: Component与PureComponent源码实现

    2024-01-01 11:22:03       31 阅读
  6. Vue Router的介绍与引入

    2024-01-01 11:22:03       43 阅读
  7. 机器视觉系统选型-选型示例分享

    2024-01-01 11:22:03       39 阅读
  8. 2023年终总结及计划

    2024-01-01 11:22:03       34 阅读
  9. Python高级数据类型

    2024-01-01 11:22:03       40 阅读
  10. 《Linux Nano命令详解:小而强大的文本编辑器》

    2024-01-01 11:22:03       43 阅读