zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    函数细节
    ElementUI的Table组件自定义合计行内容
    好看的字体收藏
    MD5加密生成与SHA526加密生成
    XML和Map之间互相转换
    银联支付
    微信支付开发
    MySql创建索引,添加索引
    jqgrid分级表格合并
    关于C# XmlDocument方法Load加载流后自动释放流的解决方法
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7787356.html
Copyright © 2011-2022 走看看