[C/C++] constexpr函数
常量表達(dá)式是指值不會(huì)改變并且在編譯過(guò)程就能夠得到計(jì)算結(jié)果的表達(dá)式。顯然,字面值屬于常量表達(dá)式,用常量表達(dá)式初始化的 const 對(duì)象也是常量表達(dá)式。如下:
?
const int max_num = 20; // max_num是常量表達(dá)式
const int limit = max_num + 1; // limit 是常量表達(dá)式
int staff_size = 2; // staff_size 不是常量表達(dá)式,因?yàn)閟taff_size沒(méi)有用const修飾
const int zs = get_size(); // sz 不是常量表達(dá)式,雖然sz是個(gè)常量,但它的值在運(yùn)行時(shí)才能確定
?
可見(jiàn):一個(gè)對(duì)象(或表達(dá)式)是不是常量表達(dá)式由它的數(shù)據(jù)類型(是否const)和初始值共同決定。
?
?
constexpr(const expression):
const可以用來(lái)修飾常量,可是只有當(dāng)其初始值是個(gè)常量表達(dá)式時(shí),const修飾的對(duì)象才是個(gè)常量表達(dá)式。C++11 提出了 constexpr 用于定義常量表達(dá)式。一般而言,如果你認(rèn)定變量是一個(gè)常量表達(dá)式,那就把它聲明成 constexpr 類型。constexpr 變量在定義時(shí)必須初始化.
?
constexpr int mf = 20; // mf是常量表達(dá)式
constexpr int limit = mf + 1; // limit 是常量表達(dá)式
constexpr int sz = get_sz(); // 只有當(dāng) get_sz() 是一個(gè) constexpr 函數(shù)時(shí)才是一條正確的聲明語(yǔ)句
?
?
?
?
?
指針和 constexpr:
當(dāng) constexpr 修飾指針時(shí),constexpr 僅對(duì)指針有效,與指針?biāo)傅膶?duì)象無(wú)關(guān):
?
const int *p = nullptr; // p 是指向常量的指針
constexpr int *q = nullptr; // q 是常指針,constexpr 僅對(duì)指針有效
?
當(dāng)然,const 和 constptr 可以一起來(lái)修飾一個(gè)指針,用于表明指向常量的常指針。
?
constexpr const int *p = &i; // 指向常量的常指針,注意 &i 必須是常量表達(dá)式,i可以是全局變量或靜態(tài)變量等等。。這些變量的地址在編譯時(shí)就確定了?
constexpr函數(shù):
?
constexpr函數(shù)是指能用于常量表達(dá)式的函數(shù)。不同于一般函數(shù),constexpr 函數(shù)的返回值類型及所有形參的類型都是字面值類型(算術(shù)類型,引用,指針等屬于字面值類型),而且函數(shù)體中有且只有一條 return 語(yǔ)句。為了能在編譯過(guò)程中隨之展開(kāi),constexpr函數(shù)被隱式地指定為內(nèi)聯(lián)函數(shù)。constexpr 函數(shù)的返回值在編譯時(shí)就能被確定。
我們?cè)试S constexpr 函數(shù)不一定返回常量表達(dá)式,但是我們認(rèn)為:
// 如果 arg 為常量表達(dá)式,則 scale(arg)也是常量表達(dá)式
constexpr size_t scale(size_t cnt) { return 2 * cnt;}
?
舉例:
?
#include <iostream>
constexpr size_t scale(size_t cnt) {
return 2 * cnt;
}
int main () {
constexpr size_t sz;
constexpr size_t s = 3;
sz = scale(s);
std::cout << sz << std::endl;
return 0;
}
可見(jiàn),constexpr 函數(shù)不一定返回常量表達(dá)式,但是在 scale(3) 可以在編譯時(shí)確定。
總結(jié)
以上是生活随笔為你收集整理的[C/C++] constexpr函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: string’ does not nam
- 下一篇: [C++]constexpr函数