constexpr函數

有點難理解權且記住,使用纔會體會其中真正的差別。

常量表達式的概念:在編譯期就可以計算出結果的表達式。
那麼爲什麼要用常量表達式呢,用常量表達式會有什麼好處:
1.允許一些計算只在編譯時進行一次,而不是每次程序運行時;
2.編譯器可以進行尺度更大的優化;
3.可以用在需求編譯期間常量的上下文,例如數組長度等;

使用constexpr修飾變量時:
const 變量的初始化可以延遲到運行時,而 constexpr 變量必須在編譯時進行初始化。
所有constexpr對象都是const的,但是不是所有的const對象都是constexpr的。

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

常量構造函數的要求:
1.成員變量只能通過初始化列表來初始化,函數體必須爲空
2.初始化列表只能由常量表達式來賦值

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

在C++11與C++14的區別:
在C++11標準中,對於constexpr修飾的函數給了及其苛刻的限定條件:函數的返回值類型及所有形參的類型都是字面值類型,而且函數體內必須有且只有一條return語句。
這個條件顯然是太苛刻了,以至於很多在constexpr的操作都要藉助?:表達式,遞歸等辦法實現。
在C++14中,放寬了這一限定,只保留了“函數的返回值類型及所有形參的類型都是字面值類型”,也就是說,這些值都在編譯期能確定了就行。


constexpr與const的本質區別
const主要用於表達“對接口的寫權限控制”,即“對於被const修飾的量名(例如const指針變量),不得通過它對所指對象作任何修改”。
(但是可以通過其他接口修改該對象)。另外,把對象聲明爲const也爲編譯器提供了潛在的優化可能。
具體來說就是,如果把一個量聲明爲const,並且沒有其他地方對該量作取址運算,那麼編譯器通常(取決於編譯期實現)會用該量的實際常量值直接替換掉代碼中所有引用該量的地方,而不用在最終編譯結果中生成對該量的存取指令。

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

能否同時使用constexpr與const?
對於變量來講,一般情況下constexpr已經包含了const的語義,所以沒必要同時使用;但是也有特殊情況:

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

在這裏const和constexpr在修飾不同的東西,constexpr和const都必須要有。constexpr表示NP指針本身是常量表達式,而const表示指向的值是一個常量。去掉const之後無法編譯,因爲不能用正常指針指向常量。
對於成員函數來講,在C++11中constexpr同樣包含const的含義,但是C++14中則不,所以C++14中可能會需要同時使用const與constexpr。

作者:丑角的晨歌
鏈接:https://www.jianshu.com/p/461daaac16af
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。
————————————————
版權聲明:本文爲CSDN博主「寧靜以致墨」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/baiyibin0530/article/details/89348517

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章