环球速递!新摩卡:横向对比优势明显 销量有望就此提振
长安UNI-KiDD版全系采用P2PHEV架构,在技术形态上稍逊一筹,整体定价不高,官方指导价18 79万-21 59万,店
常量表达式(const expression)是指值不会改变并且在编译过程中就能得到计算结果的表达式。字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
只要有可能使用constexpr,就使用它。
C++11中constexpr的使用:
【资料图】
constexpr是C++11中添加的一个特性,其主要思想是通过在编译时而不是运行时进行计算来提高程序的性能,将时间花在编译上,而在运行时节省时间(类似于模版元编程)。
C++11规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
尽管不能使用普通函数作为constexpr变量的初始值,但C++11标准允许定义一种特殊的constexpr函数。这种函数应该足够简单以使得编译时就可以计算其结果,这样就能用constexpr函数去初始化constexpr变量了。
一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。
所有constexpr对象都是const对象,而并非所有的const对象都是constexpr对象。如果你想让编译器提供保证,让变量拥有一个值,用于要求编译期常量的语境,那么能达到这个目的的工具是constexpr,而非const。
constexpr函数是指能用于常量表达式的函数。定义constexpr函数的方法与其它函数类似,不过要遵循几项约定:函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句。constexpr函数或构造函数被隐式地指定为内联函数。
constexpr函数体内也可以包含其它语句,只要这些语句在运行时不执行任何操作就行。例如,constexpr函数中可以有空语句、类型别名以及using声明。
允许constexpr函数的返回值并非一个常量。constexpr函数不一定返回常量表达式。
和其它函数不一样,内联函数和constexpr函数可以在程序中多次定义。不过,对于某个给定的内联函数或者constexpr函数来说,它的多个定义必须完全一致。基于这个原因,内联函数和constexpr函数通常定义在头文件中。
constexpr函数只能调用其它constexpr函数,不能调用简单函数(simple function)。constexpr函数不应该是void类型。constexpr函数中不允许有前缀增量(++i),在C++14中已删除此限制。
constexpr函数的理解:
(1).constexpr函数可以用在要求编译期常量的语境中。在这样的语境中,若你传给一个constexpr函数的实参值是在编译期已知的,则结果也会在编译期间计算出来。如果任何一个实参值在编译期未知,则你的代码将无法通过编译。
(2).在调用constexpr函数时,若传入的值有一个或多个在编译期未知,则它的运作方式和普通函数无异,亦即它也是在运行期执行结果的计算。这意味着,如果函数执行的是同样的操作,仅仅应用的语境一个是要求编译期常量的,一个是用于所有其它值的话,那就不必写两个函数。constexpr函数就可以同时满足所有需求。
constexpr函数仅限于传入和返回字面类型(literal type),意思就是这样的类型能够持有编译期可以决议的值。在C++11中,所有的内建类型,除了void,都符合这个条件。但是用户自定义类型同样可能也是字面类型,因为它的构造函数和其它成员函数可能也是constexpr函数。
在C++11中,constexpr函数都隐式地被声明为const。
以下为测试代码:
namespace {// constexpr function: constexpr函数被隐式地指定为内联函数constexpr int new_sz() { return 42; }constexpr size_t scale(size_t cnt) { return new_sz() * cnt; }constexpr int product(int x, int y) { return (x * y); }// pow前面写的那个constexpr并不表明pow要返回一个const值,它表明的是如果base和exp是编译期常量,pow的返回结果// 就可以当一个编译期常量使用;如果base和exp中有一个不是编译期常量,则pow的返回结果就将在执行期计算constexpr int pow(int base, int exp) noexcept{return (exp == 0 ? 1 : base * pow(base, exp - 1));}} // namespaceint test_constexpr_1(){// constexpr variablesconstexpr int mf = 20; // 20 is a constant expressionconstexpr int limit = mf + 1; // mf + 1 is a constant expressionconstexpr int foo = new_sz(); // foo is a constant expressionstd::cout << "foo:" << foo << "\n"; // foo:42// 当scale的实参是常量表达式时,它的返回值也是常量表达式;反之则不然int arr[scale(2)]; // okint i = 2;//int a2[scale(i)]; // error: scale(i)不是常量表达式size_t value = scale(i); // ok,constexpr函数不一定返回常量表达式std::cout << "value:" << value << "\n"; // value:84int sz = 1;//constexpr auto array_size = sz; // error, sz的值在编译期未知const auto array_size1 = sz; // ok, array_size1是sz的一个const副本int arr2[product(2, 3)] = { 1, 2, 3, 4, 5, 6 };std::cout << "arr2[5]:" << arr2[5] << "\n"; // arr2[5]:6return 0;}
constexpr构造函数:尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。事实上,一个字面值常量类必须至少提供一个constexpr构造函数。
constexpr构造函数可以声明成=default的形式(或者是删除函数的形式=delete)。否则,constexpr构造函数就必须既符合构造函数的要求(意味着不能包含返回语句),又符合constexpr函数的要求(意味着它能拥有的唯一可执行语句就是返回语句)。综合这两点可知,constexpr构造函数体一般来说应该是空的。我们通过前置关键字constexpr就可以声明一个constexpr构造函数了。
constexpr构造函数必须初始化所有数据成员,初始值或者使用constexpr构造函数,或者是一条常量表达式。
constexpr构造函数用于生成constexpr对象以及constexpr函数的参数或返回类型。
以下为测试代码:
namespace {class Debug {public:// constexpr构造函数必须初始化所有数据成员constexpr Debug(bool b = true) noexcept : hw_(b), io_(b), other_(b) {}constexpr Debug(bool h, bool i, bool o) noexcept : hw_(h), io_(i), other_(o) {}constexpr bool any() const noexcept { return hw_ || io_ || other_; }constexpr bool get_hw() const noexcept { return hw_; }constexpr bool get_io() const noexcept { return io_; }constexpr bool get_other() const noexcept { return other_; }void set_hw(bool b) noexcept { hw_ = b; }void set_io(bool b) noexcept { io_ = b; }void set_other(bool b) noexcept { other_ = b; }//constexpr void set_hw(bool b) noexcept { hw_ = b; } // C++14//constexpr void set_io(bool b) noexcept { io_ = b; }//constexpr void set_other(bool b) noexcept { other_ = b; }private:bool hw_, io_, other_;};constexpr Debug hw_debug(const Debug& d1, const Debug& d2) noexcept{return d1.get_hw() && d2.get_hw(); // 调用constexpr成员函数}} // namespaceint test_constexpr_2(){constexpr Debug debug(false, true, false);if (debug.any())std::cout << "any true" << std::endl; // will outputif (debug.get_io())std::cout << "get_io true" << "\n"; // will outputconstexpr Debug prod(false);if (prod.any())std::cout << "any true" << std::endl; // will not outputconstexpr auto hw = hw_debug(debug, prod); // 使用constexpr函数的结果来初始化constexpr对象std::cout << "hw:" << hw.get_hw() << "\n"; // hw:0return 0;}
注:以上内容主要整理自:《C++ Primer Fifth Edition》、《Effective Modern C++》
C++14中constexpr的使用:
在C++11中,constexpr函数只能包含一组非常有限的语法,包括但不限于:typedefs、using和一条返回语句。在C++14中,允许的语法集大大扩展,包括最常见的语法,如if语句、多次返回、while或for循环等。
以下为测试代码:
namespace {// C++14 constexpr functions may use local variables and loopsconstexpr int pow2(int base, int exp) noexcept{auto result = 1;for (int i = 0; i < exp; ++i) result *= base;return result;}constexpr unsigned int factorial(unsigned int n) {if (n <= 1)return 1;elsereturn n * factorial(n - 1);}} // namespaceint test_constexpr_14_1(){constexpr auto value = pow2(2, 4);std::cout << "pow2 value:" << value << "\n"; // pow2 value:16constexpr auto value2 = factorial(5);std::cout << "factorial value:" << value2 << "\n"; // factorial value:120return 0;}
执行结果如下:
GitHub:https://github.com/fengbingchun/Messy_Test
关键词:
长安UNI-KiDD版全系采用P2PHEV架构,在技术形态上稍逊一筹,整体定价不高,官方指导价18 79万-21 59万,店
1 公告基本信息基金名称广发积极优势混合型基金中基金(FOF-LOF)基金简称广发积极优势混合(FOF-LOF)基金
来为大家解答以下的问题,机密码忘了数字锁怎么解锁,手机密码忘了数字锁这个很多人还不知道,现在让我们一
环境日探访生态秘境“华西雨屏”,揭开原始森林的神秘面纱苍穹之下,万物化生,大自然的独特演绎,孕育出亿
【美国债务上限危机暂缓但更多危机正在靠近!】美国总统拜登3日下午签署一项关于联邦政府债务上限和预算的
海淀这个安置房项目开工了——,拆迁,安置房,东升镇,明光村,老旧小区
博彩业务一枝独秀,酒店业务恢复元气,让远东发展看到了分拆TWC集团独立发展的希望。
2023上海夜生活节昨晚如期揭幕,经过3年发展,上海夜生活节在促进夜间消费增长、激发夜间经济活力的同时,
卧龙苍天陨落是近期备受玩家们关注的一款三国类游戏,近日,官方正式公布了游戏正式版的试玩demo,这一次游
1、2013年8月中国内部审计协会发布了修订的《中国内部审计准则》,自2014年1月1日起实施。2、中国内部审计
6月1日,“会心之境”2022集美·两岸大学生摄影大赛获奖作品展暨2023集美两岸大学生摄影作品征集启动仪式在
企业动力十足经济趁热打铁!(戳视频↑)时间进入六月叙州区多家民营企业订单饱和正聚焦目标任务铆足干劲忙
中国银河证券发布研报称,从全球资产的配置角度来看,当前A股具有估值高性价比+宏观经济相对较为稳定的优势
近日,我国自主研制的超大型集装箱船“地中海米歇尔卡佩里尼”轮首航。6月2日下午,“地中海米歇尔卡佩里尼
今年3月启动的第二届上海市青少年人工智能与编程实践活动昨天在华东理工大学附属中学迎来终评,共有450余位
股东不可以劳务出资,股东出资的方式只有两种,一种是货币出资、一种是非货币财产作价出资,劳务不属于任何
欢迎回家!今晨神舟十五号载人飞船返回舱成功着陆三名航天员出舱身体状态良好航天员张陆说:历经四次出舱
来为大家解答以上问题,吉利银河l7发布会,魅蓝3s发布会很多人还不知道,现在让我们一起来看看吧!1、各大
(123)8分,入社, 800万枚。(124)8分,耕种, 800万枚。(125)8分,造林, 800万枚。(126)8分
1、迪拜的burjal-arab酒店(burj音译泊瓷,又称阿拉伯塔)现在它是世界上唯一的7星级酒店住一天需要133
走过戈壁历练创业品格
A股新退市制度8大看点——构建A股全市场统一退市新规则武汉科技大学金融证券研究所所长董登新教授2020年11
1、那是我童年最开心的时光之一---享受着美妙的音乐,重温着一张张熟悉可爱的画面,沉浸在与朋友们一起升级
来为大家解答以下的问题,什么手机视频没有声音怎么办,电脑播放视频没有声音怎么办这个很多人还不知道,现
“工程师、科学家花了很长时间研发出来的(教育)解决方案和产品,为什么老师不喜欢用?”6月2日,在由北京