首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++23新特性—if consteval 编译时优化

一、来龙去脉 C++诞生之日起使用的const关键字声明一个常量,随后C++ 11版本又引入了constexpr 关键字,主要功能是声明一个编译时常量表达式(constant expression)...它被用于变量、函数以及构造函数,并且在编译阶段就可以参与计算。...C++ 17版本又对该关键字的功能进行了扩充,提供了if constexpr表达式,是指在编译阶段可以可以进行条件编译,并根据结果选择可以编译或者不编译哪些代码块。...使用过程需要注意的是consteval if语句内部的条件表达式必须是在编译时期可计算的常量表达式。如果条件表达式在编译时期无法确定,将导致编译错误。...三、总结 本文主要介绍了C++23版本中提供的一个新的特性,需要注意的是coneval函数是在编译期执行的,因此它的结果是在编译期计算出来,这也就要求编码人员使用时就需要明确它能够在编译期进行计算,否则将产生错误

36120
您找到你想要的搜索结果了吗?
是的
没有找到

C++23编程新特性

(可选) consteval 复合语句 else 语句 C++17新增了基于编译和运行时条件,C++23在此基础上又做了提升,新增特性支持明显语境下可以进行求值。...C++23开始,满足条件的函数this可以被显示传参,但使用过程依旧需要遵循如下规范: 作为函数参数时需要是函数的首个形参 作用于lambda表达式时作为首个形参 不能在const、static关键字修复的函数使用...可以模板中使用,也可以称为this推到 具体代码使用示例如下: struct A { void f(this C& self,int iRate); template<typename Self...9、std::move_only_function 这个新增的包装器被定义头文件,该包装器可以调用或者存储任何一个可以被存储并调用任何可构造或者调用的函数。...int main() { static_assert(std::byteswap('b') == 'b'); } 对于C++23新增特性很多编译器已经都能够进行支持,当然C++23版本规划的内容也不止上面说的这些

27010

C++ 动态新闻推送 第2期

公众号 本周周报github直达 llvm weekly http://llvmweekly.org/issue/374 文章 你也可能会遇到 最近有一篇文章,介绍GTA 5 online为什么那么慢,...以及解决办法,详情见这里 ,主要原因 1 sscanf每次读都会检查长度, 对于大文件性能太差 2 数据用hashmap存不是if判断 作者反思自己的库用到了sscanf,会不会遇到类似的问题?...,要注意这个函数有很大问题,尽量用替换方案 不要无脑使用emplace_back emplace_back接受的是右值,如果为了省掉拷贝,尽量传右值,无脑替换是没有意义的 Creating a co_await...Keyword 理解成constexpr严格版本,只能编译期计算。...使用场景,hash 计算,不泄漏符号 ---- 看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持!

41410

C++ 中文周刊 第91期

C++ 中文周刊 第91期 资讯 编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-11-30 第178期 文章 Stack overflow in ping(8) 离谱,freebsd...的ping 有溢出漏洞 const vs constexpr vs consteval vs constinit in C++20 来个 表格 关键字 放在变量前 放在static/thread_local...前 放在函数前 常量表达式前 const 可以 可以 成员函数 有时可以 constexpr 可以 (初始化得是constexpr的) 可以 必须是满足constexpr属性的函数 可以 consteval...不行 不行 满足consteval函数 接受返回值,可以 constinit 不行 必须常量初始化 不行 不行 Falsehoods programmers believe about undefined...场景都特简单 int main() { std::vector data{ 1,1,2,3,5,8,13,21,34,55 }; for (auto it = data.begin

46020

超详细STL之array容器使用及实现原理解析

说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。 本篇文章讲述STLarray的使用及原理。...array容器的类型是包括两个模板参数:元素类型和元素个数,如果不一致,编译时没有办法通过的。...,编译器应该是根据左边变量的类型来决定到底要调用哪个函数的。...*ite3这里输出了5,说明rbegin 反转了位置和方向。...array说白了,就是一个固定大小的数组基础上进行了一些封装,且使用了模板,让我们可以灵活定义各种类型的数组,既然是数组,那必然是一段连续的地址空间,对于一段连续的地址空间,不论是获取数据还是修改数据都可以常量复杂度下完成

74430

C++20 读书笔记(1)

最近在看C++20相关的内容,本篇记录下遇到的比较好用的特性 Module C++20新增的4个大特性之一,Module解决的是以前C编译include预处理效率低下痛点。...提案地址,具体内容单独介绍,需要了解的事 module,import也成为关键字了,C++20之前的代码最好不要使用,防止冲突。...greater: First operand greater than second weak_ordering::equivalent: Equal operands 也提供了其他的方法可以使用...: is_eq(), is_neq(), is_lt(), is_lteq(), is_gt(), and is_gteq() consteval 类比于constexpr 可能在编译期间执行,consteval...可以保证会在编译期间执行 std::string_view const char *的替代品,只读字符串,也同时支持std::string的功能 Linux上的内存泄漏检测工具 Valgrind 输出会是如下的样子

20410

C++ 动态新闻推送 第53期

能省几行代码 TIL: nullopt_t is not equality-comparable, but monostate is 有些类型是可以拷贝但不能比较的,比如function STL还有哪个组件类似...constexpr std::monostate m; static_assert(m == m); std::monostate按理说就是个tag类型,比较没有意义,但是这里确实可以比较,本身有value...语义 再比如 constexpr std::nullopt_t n; bool b = (n == n); // Error: does not compile!...nullopt明显没有value语义 Bugs in Hello World 通过把输出定向到 /dev/full 可以看到错误硬件错误,这是一个测试的好手段,可以判断如果调用了硬件接口报错是不是真的处理了错误码...Param> consteval decltype(auto) consteval_invoke(Param && ... param) { return std::invoke(std::forward

17810

C++:Lambda表达式

C++11 和更高的版本,lambda 表达式通常称为 lambda —— 是一种调用它或作为参数传递给函数时定义匿名函数对象(闭包)的简便方法。...此指定符不存在时,若函数调用运算符恰好满足所有 constexpr 函数要求,则它也会是 constexpr(C++17 起) consteval :指定函数调用运算符为立即函数。...不能同时使用 constevalconstexpr 。(C++20 起) exception - 异常规范(可选)。...利用可变规范,lambda 表达式的主体可以修改通过值捕获的变量。 示例3.1.2 lambda 函数体内对值捕获的外部变量进行修改会提示错误,我们可以通过加入 mutable 关键字来解决。...否则,编译器会推导返回类型为void。 3.6 函数体 Lambda 函数可以包含普通方法或函数的主体可以包含的任何内容。

1.1K52

C++:Lambda表达式

C++11 和更高的版本,lambda 表达式通常称为 lambda —— 是一种调用它或作为参数传递给函数时定义匿名函数对象(闭包)的简便方法。...此指定符不存在时,若函数调用运算符恰好满足所有 constexpr 函数要求,则它也会是 constexpr(C++17 起) consteval :指定函数调用运算符为立即函数。...不能同时使用 constevalconstexpr 。(C++20 起) exception - 异常规范(可选)。...利用可变规范,lambda 表达式的主体可以修改通过值捕获的变量。 示例3.1.2 lambda 函数体内对值捕获的外部变量进行修改会提示错误,我们可以通过加入 mutable 关键字来解决。...否则,编译器会推导返回类型为void。 3.6 函数体 Lambda 函数可以包含普通方法或函数的主体可以包含的任何内容。

2.2K31

第七章 函数

第七章 函数 函数基础 函数:封装了一段代码,可以一次执行过程中被反复调用。...x + y; } 函数详解 参数 函数可以函数头的小括号包含零到多个形参 包含零个形参时,可以使用void标记 对于非模板函数来说,其每个形参都有确定的类型,但形参可以没有名称 形参名称的变化并不会引入函数的不同版本...(image-37f2f5-1690910469933)] 函数相关的其他内容 递归函数函数调用其自身的函数 通常用于描述复杂的迭代过程(示例)比如二分查找 内联函数/constexpr函数...(表示在编译器执行,也可以在运行期执行)(C++11起)/consteval函数(C++20起)(只能在编译期执行) 内联函数的展开: 1.逻辑简单的函数可能会被展开 2.内联函数展开并不是简单的替换...小心:Most vexing parse,尝试使用大括号替换小括号,明确表示我们要构造一个对象不是声明一个函数

16830

C++20新特性个人总结

此前为了解决冲突问题,功能②被大量地使用,新版本为了提高可读性,加强了编译的推导能力,简化typename功能②的使用。 ...②禁止constexpr函数使用try-catch语句块。不再赘述。 ...10 : a = 20; // 错误,a = 10不是常量表达式 };  2.2  修改const限定的成员指针  一个右值的 .* 表达式,如果表达式的第二个参数是指向以&修饰的成员函数的指针,那么这个程序就是不规范的...这个特性GCC、MSVC编译早已实现,但在其他的编译器以前的版本并未实现。  我的理解是,模板类内,可以忽略访问权限访问到其他类内的嵌套类。 ...函数的实例化  当仅仅获取constexpr函数的返回值类型时,不对函数进行实例化,即仅推导返回值类型,不对函数进行调用。

1.9K50
领券