日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

constexpr函数

發(fā)布時(shí)間:2024/4/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 constexpr函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有點(diǎn)難理解權(quán)且記住,使用才會(huì)體會(huì)其中真正的差別。

常量表達(dá)式的概念:在編譯期就可以計(jì)算出結(jié)果的表達(dá)式。
那么為什么要用常量表達(dá)式呢,用常量表達(dá)式會(huì)有什么好處:
1.允許一些計(jì)算只在編譯時(shí)進(jìn)行一次,而不是每次程序運(yùn)行時(shí);
2.編譯器可以進(jìn)行尺度更大的優(yōu)化;
3.可以用在需求編譯期間常量的上下文,例如數(shù)組長(zhǎng)度等;

使用constexpr修飾變量時(shí):
const 變量的初始化可以延遲到運(yùn)行時(shí),而 constexpr 變量必須在編譯時(shí)進(jìn)行初始化。
所有constexpr對(duì)象都是const的,但是不是所有的const對(duì)象都是constexpr的。

對(duì)constexpr函數(shù)的基本要求:
1. 常量表達(dá)式函數(shù)必須有返回值(不可以是void函數(shù))
2.常量表達(dá)式函數(shù)體中只能有一條語(yǔ)句,且該語(yǔ)句必須是return語(yǔ)句。(可以使用?:、遞歸)但不產(chǎn)生實(shí)際代碼的語(yǔ)句可以在常量表達(dá)式函數(shù)中使用,如static_assert,using,typedef等(這條規(guī)定在C++14中大幅放松)
3.return語(yǔ)句中,不能使用非常量表達(dá)式的變量、函數(shù),且return的表達(dá)式也要是常量表達(dá)式
4.常量表達(dá)式函數(shù)在使用前,必須有定義。(普通函數(shù)在被調(diào)用前只要有函數(shù)聲明就夠了,不一定有定義)

常量構(gòu)造函數(shù)的要求:
1.成員變量只能通過(guò)初始化列表來(lái)初始化,函數(shù)體必須為空
2.初始化列表只能由常量表達(dá)式來(lái)賦值

常量成員函數(shù)的要求:
常量成員函數(shù)被隱式定義為const成員函數(shù),不可以通過(guò)常量成員函數(shù)去修改成員變量。也就是說(shuō),常量成員函數(shù)往往是所謂的getter函數(shù)。(c++14則不同,允許constexpr成員函數(shù)去修改成員變量)
常量成員函數(shù)不能是virtual的

在C++11與C++14的區(qū)別:
在C++11標(biāo)準(zhǔn)中,對(duì)于constexpr修飾的函數(shù)給了及其苛刻的限定條件:函數(shù)的返回值類(lèi)型及所有形參的類(lèi)型都是字面值類(lèi)型,而且函數(shù)體內(nèi)必須有且只有一條return語(yǔ)句。
這個(gè)條件顯然是太苛刻了,以至于很多在constexpr的操作都要借助?:表達(dá)式,遞歸等辦法實(shí)現(xiàn)。
在C++14中,放寬了這一限定,只保留了“函數(shù)的返回值類(lèi)型及所有形參的類(lèi)型都是字面值類(lèi)型”,也就是說(shuō),這些值都在編譯期能確定了就行。


constexpr與const的本質(zhì)區(qū)別
const主要用于表達(dá)“對(duì)接口的寫(xiě)權(quán)限控制”,即“對(duì)于被const修飾的量名(例如const指針變量),不得通過(guò)它對(duì)所指對(duì)象作任何修改”。
(但是可以通過(guò)其他接口修改該對(duì)象)。另外,把對(duì)象聲明為const也為編譯器提供了潛在的優(yōu)化可能。
具體來(lái)說(shuō)就是,如果把一個(gè)量聲明為const,并且沒(méi)有其他地方對(duì)該量作取址運(yùn)算,那么編譯器通常(取決于編譯期實(shí)現(xiàn))會(huì)用該量的實(shí)際常量值直接替換掉代碼中所有引用該量的地方,而不用在最終編譯結(jié)果中生成對(duì)該量的存取指令。

constexpr的主要功能則是讓更多的運(yùn)算可以在編譯期完成,并能保證表達(dá)式在語(yǔ)義上是類(lèi)型安全的。
(譯注:相比之下,C語(yǔ)言中#define只能提供簡(jiǎn)單的文本替換,而不具任何類(lèi)型檢查能力)。
與const相比,被constexpr修飾的對(duì)象則強(qiáng)制要求其初始化表達(dá)式能夠在編譯期完成計(jì)算。之后所有引用該常量對(duì)象的地方,若非必要,一律用計(jì)算出來(lái)的常量值替換。

能否同時(shí)使用constexpr與const?
對(duì)于變量來(lái)講,一般情況下constexpr已經(jīng)包含了const的語(yǔ)義,所以沒(méi)必要同時(shí)使用;但是也有特殊情況:

static constexpr int N = 3; int main() {constexpr const int *NP = &N;return 0; }

在這里const和constexpr在修飾不同的東西,constexpr和const都必須要有。constexpr表示NP指針本身是常量表達(dá)式,而const表示指向的值是一個(gè)常量。去掉const之后無(wú)法編譯,因?yàn)椴荒苡谜V羔樦赶虺A俊?br /> 對(duì)于成員函數(shù)來(lái)講,在C++11中constexpr同樣包含const的含義,但是C++14中則不,所以C++14中可能會(huì)需要同時(shí)使用const與constexpr。

作者:丑角的晨歌
鏈接:https://www.jianshu.com/p/461daaac16af
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
————————————————
版權(quán)聲明:本文為CSDN博主「寧?kù)o以致墨」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/baiyibin0530/article/details/89348517

總結(jié)

以上是生活随笔為你收集整理的constexpr函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。