建设工程168网站网站建设中中文模板

张小明 2026/1/8 8:26:46
建设工程168网站,网站建设中中文模板,至高建设集团 网站,设计上海展会2021概述 constexpr#xff1a;声明“该实体可以在编译期求值”#xff0c;随着 C 标准被逐步放宽#xff0c;现在能在更多场景写编译期函数/构造器/变量。C20 还新增了 consteval#xff08;强制编译期#xff09;与 constinit#xff08;强制常量初始化#xff09;。expli…概述constexpr声明“该实体可以在编译期求值”随着 C 标准被逐步放宽现在能在更多场景写编译期函数/构造器/变量。C20 还新增了consteval强制编译期与constinit强制常量初始化。explicit用于阻止不期望的隐式转换。除了对构造函数适用外C11 开始可标注转换运算符conversion operatorsC20 引入了条件explicit(expr)能按表达式决定是否为显式。一、constexpr深度讲解1. 含义核心语义constexpr表示函数/构造器/变量在满足条件时可以在编译期求值从而能用作常量表达式用于数组维度、模板非类型参数、static_assert等。对象变量使用constexpr其初始化器必须是常量表达式直到 C14 的限制放宽后更灵活。函数/构造函数使用constexpr表明在满足参数均为常量表达式的情况下函数可被用于编译期求值否则仍可在运行时调用。2. 演进变化constexpr的能力随标准放宽C11首次引入函数体必须是单一return很受限。C14允许更复杂的函数体局部变量、循环、分支constexpr函数功能大增。C17语义继续放宽数组/结构体初始化等更多场合支持常量求值。C20引入consteval强制在编译期求值和constinit强制静态变量为常量初始化并继续扩展constexpr支持例如允许虚函数在某些情形下为constexpr。新关键词对比C20constexpr可以在编译期或运行期求值视调用上下文而定。consteval必须在编译期求值若在运行期调用则编译错误。用来写“即时常量函数”。constinit用于静态/线程局部变量强制其进行常量初始化防止静态初始化次序问题。3.constexpr的常见用法示例3.1constexpr变量constexprintsquare(intx){returnx*x;}// C14 起允许复杂体constexprintfive5;constexprinttwentyfivesquare(five);// 编译期求值static_assert(twentyfive25);3.2constexpr函数运行期与编译期两用constexprintfib(intn){if(n1)returnn;returnfib(n-1)fib(n-2);}intmain(){constexprintf5fib(5);// 编译期intk;cink;intrfib(k);// 运行期也可调用}3.3constexpr构造函数常用于字面类型structPoint{doublex,y;constexprPoint(doublea,doubleb):x(a),y(b){}constexprdoublenorm2()const{returnx*xy*y;}};constexprPoint p{3.0,4.0};static_assert(p.norm2()25.0);注意直到 C20constexpr成员函数和构造器的语义被逐步增强允许更多操作如改变constexpr成员变量等。4.consteval与constinitconstevalintmust_be_constexpr(intn){returnn*2;}// 必须在编译期调用constinitintgmust_be_constexpr(10);// g 在编译期初始化consteval用于那些希望强制在编译期完成的计算例如生成编译期表或做元编程检查。5. 常见误区与陷阱constexpr不是所有constexpr函数调用都会在编译期执行是否在编译期执行取决于调用时传入的参数是否为常量表达式以及使用场景需要编译期值时才强制求值。constexpr函数内部不能使用非constexpr的操作例如动态分配、IO否则在尝试编译期求值时会失败但该函数仍可在运行期被调用除非用consteval。不要把constexpr当作“强制内联或优化提示”—— 它的本意是可编译期求值优化与否由编译器决定。constexpr与noexcept互不替代但常见constexpr函数也声明noexcept如果它们无异常以改善使用场景。6. 实战建议constexpr对纯计算、常量生成函数使用constexpr可在编译期做更多检查并得到更高性能。若函数必须在编译期求值设计要求使用consteval。对类提供constexpr构造函数 / 方法以便可在编译期创建字面量对象例如元数据、表格。在大型项目中谨慎使用constexpr以避免过度编译期计算导致编译时间增加。有关constexpr的标准细节参考cppreference的constexpr条目。二、explicit深度讲解1. 含义核心语义explicit的目的是禁止编译器执行某些隐式转换从而避免意外、难以察觉的类型转换错误。它可以修饰构造函数阻止从单参数构造函数的隐式转换 — 自 C98。用户定义的转换运算符conversion operator— 自 C11。C20 引入explicit(expression)可以根据编译期表达式条件性地使其显式。2. 为什么需要explicit隐式转换在方便的同时会引发难以发现的逻辑错误、二义性或意外重载匹配explicit能把“自动发生”的转换变成“必须写成T(x)或static_castT(x)的显式转换”提高代码可读性与安全性。3.explicit用法示例3.1 对构造函数structA{explicitA(intx):v(x){}intv;};voidfoo(A a){}foo(10);// 错误A(int) 为 explicit禁止隐式转换foo(A(10));// 正确显式foo(static_castA(10));// 正确3.2 对转换运算符conversion operatorC11 起可以写explicit operator T() const从而禁止隐式转换为TstructS{explicitoperatorbool()const{returntrue;}};S s;if(s){}// 不能implicit conversion to bool is not allowed?// Actually if (s) requires context of boolean; for explicit operator bool, direct-initialization in if condition uses explicit? Explanation below.说明explicit operator bool()的引入是为了替代“safe bool idiom”。explicit转换运算符不会参与某些隐式转换场景从而避免意外使用。标准对什么时候允许使用显式转换运算符例如在if (expr)、static_castbool(expr)、直接初始化等做了具体规定。详见cppreference。3.3 C20 条件explicit(expr)可以根据模板参数或常量条件使构造函数/转换运算符有条件地显式templatetypenameTstructWrapper{explicit(sizeof(T)4)Wrapper(T);// C20: 如果 T 大于4字节则构造器为 explicit};或对转换运算符structX{explicit(sizeof(int)4)operatorint()const;};这种写法让模板库可以更精细控制隐式转换行为。4. 显式转换运算符的语义细节何时可以用显式转换运算符用于上下文标准允许在某些上下文需要显式转换的场合使用explicit运算符例如带有直接初始化的场合、显式类型转换static_cast、以及某些语句/条件表达式而在需要隐式转换的上下文中如拷贝初始化是不被自动使用的。cppreference对这些规则有详细列出。explicit operator bool()与if (obj)if语句要求 “contextually convertible to bool” —— 这允许显式的operator bool()被用于条件判断即if (obj)会触发显式转换运算符——这就是为什么explicit operator bool()成为 “safe bool” 的现代替代。更多细节见实践资源。5. 常见误用与陷阱explicit把每个构造函数都写成explicit会减少便利性 —— 设计上应仅对单参数或可被单参数调用的构造函数考虑explicit以防意外隐式转换。对于 conversion operator默认不要轻易设为 implicit非explicit除非非常确定该类型需要自然地作为目标类型使用例如std::string::operator std::string_view()的情况。一般建议prefers named conversion function如.to_string()而不是提供很多隐式 conversion operators。6. 推荐实践explicit对单参数构造函数通常使用explicit除非希望类型在表达式中自动构造例如某些数值/枚举封装需权衡。对用户自定义的转换运算符优先考虑explicit只在确实需要隐式转换时才允许隐式。使用 C20 的explicit(expr)在模板库中做细粒度控制而不是写很多重载/模板特化。三、constexpr与explicit的交互要点可以写constexpr explicit构造函数非常常见structS{constexprexplicitS(intx):v(x){}intv;};constexprS sS(3);// ok: explicit but direct-initialization也可以写constexpr explicit operator T()C11 起该转化可在编译期用于常量表达式求值只要上下文允许。四、实战样例综合示例#includetype_traits// C20 风格条件 explicit constexpr consteval 示范structBig{intx;constexprexplicitBig(intv):x(v){}// constexpr explicit 构造器explicitoperatorint()const{returnx;}// explicit conversion operator};constevalintmust_be_ctime(){return42;}// 强制编译期求值 (C20)constinitintgmust_be_ctime();// 强制常量初始化 (C20)static_assert(std::is_same_vdecltype(static_castint(Big(3))),int);// OK// auto a Big(3); // if function takes Big by value, implicit construction not allowed五、常见问题快速问答Qconstexpr函数内部能用循环/分支吗A可以从 C14 起放宽但用于编译期时函数体中的所有操作必须可在编译期执行不能进行未允许的运行时操作。Qconsteval和constexpr的区别Aconsteval强制编译期求值constexpr允许编译期也允许运行期调用。Qexplicit operator什么时候应该使用A当你想阻止类型被无意间隐式转换尤其是布尔/数值上下文时应使用explicit否则可能引发模糊或错误的重载选择。六、参考资料constexpr specifier (since C11)— cppreference详述constexpr演进与限制。Conversion function (operator type) — cppreference说明explicit operator的语法与语义及 C20 条件 explicit。const vs constexpr vs consteval vs constinit总结与对比含 C20 新关键字。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做培训网站网址导航网站如何做

解决Sanic CLI开发模式异常的3种高效方法 【免费下载链接】sanic Accelerate your web app development | Build fast. Run fast. 项目地址: https://gitcode.com/gh_mirrors/sa/sanic Sanic作为Python高性能异步Web框架,在23.12.0版本中CLI工具出现了一个棘…

张小明 2025/12/31 1:57:29 网站建设

佛山智能模板建站九牧全球市场地位

第一章:客户满意度提升300%的秘密:金融客服Agent应答逻辑概述在金融科技快速发展的背景下,客户对服务响应速度与准确性的要求日益提高。传统人工客服已难以应对高并发、多场景的咨询需求,而智能客服Agent通过精细化的应答逻辑设计…

张小明 2025/12/31 9:34:09 网站建设

常州网站推广公司免费发布广告信息平台

SenseVoice-Small技术评测:非自回归语音理解新范式 【免费下载链接】SenseVoice Multilingual Voice Understanding Model 项目地址: https://gitcode.com/gh_mirrors/se/SenseVoice 在语音技术快速发展的当下,推理效率成为制约模型实际应用的关键…

张小明 2026/1/1 2:08:18 网站建设

网站内页收录突然没了多元国际二维码入口

1. 需求mac自带的python3版本为3.9.6,期望将其升级到3.13版本。mac版本:Apple M4 。2. 升级python版本这里使用Homebrew 来升级python版本。2.1 安装或更新 Homebrew如果已安装了Homebrew,跳过该步骤。/bin/bash -c "$(curl -fsSL https…

张小明 2026/1/1 3:25:47 网站建设

大连专业html5网站建设3322域名注册

https://blog.csdn.net/weixin_45655710?typeblog浙大疏锦行 DAY 27 函数专题2:装饰器 ps: 第一期day27对应5月16日 知识点回顾: 1.装饰器的思想:进一步复用 2.函数的装饰器写法 3.注意内部函数的返回值 作业: 编写一个装饰器logger&#x…

张小明 2026/1/1 3:25:45 网站建设

厦门建网站平台宁波网站优化技术

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

张小明 2025/12/31 6:07:17 网站建设