constexpr关键字

constexpr关键字constexpr 关键字

constexpr关键字

起因

c++20为什么使用constexpr修饰find_if

#include  
     #include  
     int main() { 
    // OK constexpr std::array<char, 6> a { 
    'H', 'e', 'l', 'l', 'o' }; // Failures: // * std::find is not constexpr constexpr auto it = std::find(a.rbegin(), a.rend(), 'H'); } 

c++20后添加constexpr对之前的代码会有影响吗(会不会导致之前的代码失效)?

按照P0202R3的介绍不会有任何影响,单纯的库扩展。

  • 让编译期计算达到类型安全
  • 一般来说,通过将计算移至编译期来提高效率
  • 支持嵌入式系统编程(尤其是 ROM)
  • 直接支持元编程
  • 让编译期编程与“普通编程”非常相似

对于Constant-expression functions值得注意的一点描述有:一个constexpr function是可能被使用non-constant expressions调用的,这个时候这个函数调用就不需要编译器计算。

constexpr int func(int x) { 
    return x; } int main() { 
    constexpr int i = 1; func(i); // 编译期计算 int j = 2; func(j); // 运行期计算 return 0; } 
// square可以解决宏函数的一些问题:类型不安全问题 constexpr int square(int x) { 
    return x * x; } // fine constexpr long long_max() { 
    return ; } // fine  constexpr int abs(int x) { 
    return x < 0 ? -x : x; } // fine  constexpr void f(int x) // error: return type is void  { 
    /* ... */ } constexpr int next(int x) { 
    return ++x; } // error: use of increment  constexpr int g(int n) // error: body not just ‘‘return expr’’  { 
    int r = n; while (--n > 1) r *= n; return r; } constexpr int twice(int x); enum { 
    bufsz = twice(256) }; // error: twice() isn’t (yet) defined  constexpr int fac(int x) { 
    return x > 2 ? x * fac(x - 1) : 1; } // error: fac() not defined before use 
#include  
     constexpr int test(int n) { 
    int k = n; // 支持局部变量 k++; return k; } int main() { 
    constexpr int i = 11; int k = test(i); // 编译期计算 int j = 22; int m = test(j); // 运行期计算 } 

Bjarne Stroustrup在HOPL4 论文的5.5章节中写道:

这种放松简化了许多 constexpr 函数并使许多 C++ 程序员感到高兴。他们不满地发现,以前在编译时只能对算法的纯函数表达式进行求值。特别是,他们希望使用循环来避免递归。就更长期来看,这释放出了要在 C++17 和 C++20中进一步放松限制的需求。为了说明潜在的编译期求值的能力,我已经指出 constexpr thread 也是可能的,尽管我并不急于对此进行提案。

  • consteval——保证在编译期进行求值的 constexpr 函数 [Smith et al. 2018a]
  • constinit——保证在编译期初始化的声明修饰符 [Fiselier 2019]
  • 允许在 constexpr 函数中使用成对的 new 和 delete [Dimov et al. 2019]
  • constexpr string 和 constexpr vector [Dionne 2018]
  • 使用 virtual 函数 [Dimov and Vassilev 2018]
  • 使用 unions、异常、dynamic_cast 和 typeid [Dionne and Vandevoorde 2018]
  • 使用用户定义类型作为值模板参数——最终允许在任何可以用内置类型的地方使用用户定义类型 [Maurer 2012]
  • is_constant_evaluated() 谓词——使库实现者能够在优化代码时大大减少平台相关的内部函数的使用 [Smith et al. 2018b]

拿constval来讲,针对上面的例子

#include  
     constval int test(int n) { 
    int k = n; // 支持局部变量 k++; return k; } int main() { 
    constexpr int i = 11; int k = test(i); // 编译期计算 int j = 22; int m = test(j); // 会导致编译失败 } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214930.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:06
下一篇 2026年3月18日 下午3:07


相关推荐

  • 如何把timestamp数据类型存储到hive中

    如何把timestamp数据类型存储到hive中前言 我们在测试 hive 数据时 经常要入库数据到 hive 中 无论是从其它数据库入库到 hive 中还是从本地导入数据到 hive 中 会遇到 timestamp 格式的数据 那么我们怎么导入进去呢 一 首先建立一个人临时表 把数据中 timestamp 格式全部变为 string 格式 CREATETABLE dwd dwd jp user member bk etl insert date string batch task name string member id string

    2026年3月17日
    2
  • 钉钉 AI 客服:多语言支持方案

    钉钉 AI 客服:多语言支持方案

    2026年3月14日
    2
  • springcloud gateway作用_gateway网关路由配置

    springcloud gateway作用_gateway网关路由配置Gateway服务网关在SpringCloud中网关的实现包括两种:①gateway②zuulzuul是基于servlet的实现,属于阻塞式编程,而springcloudgateway则是基于spring5中提供的webflux,属于响应式编程的实现,具备更好的性能.gateway快速入门1创建新的module,引入SpringCloudGetaway的依赖和nacos的服务发现依赖 <!–网关依赖–><dependency> <

    2022年10月9日
    2
  • python 爬虫之selenium可视化爬虫

    python 爬虫之selenium可视化爬虫文章目录前文回顾快速入门元素定位页面操作等待方式扩展程序加载前文回顾一文带你了解Python爬虫(一)——基本原理介绍一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍之所以把selenium爬虫称之为可视化爬虫主要是相较于前面所提到的几种网页解析的爬虫方式selenium爬虫主要是模拟人的点击操作selenium驱动浏览器并进行操作的过程是可以观察到的就类似于你在看着别人在帮你操纵你的电脑,类似于别人远程使用你的电脑当然了,selenium也有无界面模式快速入门sel

    2022年5月9日
    32
  • @ResponseBody的作用

    @ResponseBody的作用

    2021年7月19日
    97
  • TIME_WAIT过多的解决办法

    TIME_WAIT过多的解决办法执行主动关闭的那端经历了这个状态,并停留MSL(最长分节生命期)的2倍,即2MSL。TIME_WAIT存在的两个理由:1可靠的实现TCP全双工连接的终止2允许老的重复的分节在网络上的消逝第一个:如果客户端不维持TIME_WAIT状态,那么将响应给服务端一个RST,该分节被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么必须正确的处…

    2022年6月9日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号