IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 条款15:只要有可能使用constexpr就使用他 -> 正文阅读

[C++知识库]条款15:只要有可能使用constexpr就使用他

constexpr当它应用与对象时,其实就是一个加强版const;但是应用于函数时,却有着相当不同的意义;

constexpr 对象:

constexpr对象具备const属性,在编译阶段已知

int sz;							// 非constexpr变量
constexpr auto arryaSize1 = sz; // 错误!sz的数值在编译器未知
std::array<int, sz> data1;		// 错误!sz的数值在编译器未知
constexpr auto arraySize2 = 10; // 没问题,10为编译器常量
std::array<int, arraySize2> data2; // 没问题,arraySize2是个constexpr

注意:const并未提供和consexpr同样的保证,因为const对象不一定经由编译器已知值来初始化;

int sz;							// 非constexpr变量
const auto arryaSize1 = sz;     // 没问题!arraySize是sz的一个const副本
std::array<int, arryaSize1> data1;		// 错误!arryaSize1的数值在编译器未知

一言以蔽之,所有constexpr对象都是const对象,但是所有的const对象并非都是constexpr对象。如果你想让编译器提供保证,让变量拥有一个值,用于要求编译器期常量的语境,那么能达到这个目的的工具是constexpr,而非const

constexpr函数

  • constexpr函数可以用在要求编译器常量的语境当中。若你传给一个constexpr函数的实参数值是在编译期已知,则结果也会在编译期间计算出来
  • 在调用constexpr函数时,若传入的数值有一个或者多个在编译器未知,则它的运作方式和普通函数无差异

考虑一个pow函数

constexpr int pow(int base, int exp) noexcept {		// pow是一个constexpr函数,且不会抛出异常
	// ....
}

constexpr auto numConds = 5;
std::array<int, pow(3, numConds)> results;		   // results有3^numConds个元素

pow前面写的那个constexpr并不表明pow要返回一个const数值,它表明的是如果base和expr是编译器常量,pow的反馈结果就可以当一个编译器常量使用。如果baseexpr中有一个不是编译器常量,则pow的返回结果就将在执行期计算。

C++11中,constexpr函数不得包含多于一个可执行语句,即一个return语句。我们可以用条件运算符和递归解决这个问题

// C++11
constexpr int pow(int base, int exp) noexcept {
    return (exp == 0 ? 1 : base * pow(base, exp - 1));
}

C++14限制条件放宽了,下列代码在C++11中编译不过

constexpr int pow(int base, int exp) noexcept {
    int result = 1;
    for (int i = 0; i < exp; i++) {
        result *= base;
    }
    return result;
}

// 后面没太看明白用处

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:40:48  更:2021-10-04 12:42:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 23:20:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码