初探c 11之常數表示式

2022-09-05 23:03:24 字數 775 閱讀 5767

在c++11裡面,對於常數表示式有了更強的支援。乙個是函式返回值可以是常數,另外乙個是對於變數的常數表示式的支援更廣。

首先,函式返回值可以是常數。這個值你可以把它用在所有可以用常數的地方,例如乙個陣列的大小。下面是乙個例子,來自wiki.

constexpr int getfive() 

int some_value[getfive() + 5];

也就是說,乙個函式以constexpr來宣告,那麼編譯器會知道這個函式返回的是常數,從而編譯器會在編譯期進行變數替換來求出這個常數。

(這段來自wiki,本人做了整理)將函式宣告為 

constexpr有

非常嚴格的條件。首先,該函式的返回值型別不能為 void。其次,函式的內容必須是 "return 

expr

"的形式。第三點,在變數替換後,

expr

必須是個常數表示式。這些常數表示式只能夠呼叫其他被定義為 

constexpr

的函式,或是其他常數表示式的變數。 最後一點,有著constexpr宣告的函式直到在該編譯單元內被定義之前是不能夠被呼叫的。因為在呼叫時候一定要知道它的內容是什麼。

其次,變數也可以以constexpr來宣告。例如,

constexpr double dval = 3.14

;constexpr

double dval1 = dval * 3.0;

這裡與c++98不同的是,c++98中的常量只能是整數或者列舉型別。而這裡並沒有這樣的限制。

c 11之lambda表示式

c 11中的lambda表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda的語法形式如下 函式物件引數 操作符過載函式引數 mutable或exception宣告 返回值型別 可以看到,lambda主要分為五個部分 函式物件引數 操作符過載函式引數 mutable或exceptio...

C 11之lambda表示式

lambda表示式就是匿名函式,例如 auto fun int a,int b lambda的格式如下 捕獲列表 引數 捕獲列表有下面幾種 不捕獲任何變數 捕獲外部作用域的所有變數,並作為引用在函式體內使用 按引用捕獲 捕獲外部作用域的所有變數,並作為副本在函式體內使用 按值捕獲 foo 按值捕獲外...

C 11之lambda表示式

capture parameters mutable return type1.capture 捕捉列表。捕捉列表總是出現在lambda函式的開始處。實際上,是lambda引出符。編譯器根據該引出符判斷接下來的 是否是lambda函式。捕捉列表能夠捕捉上下文中的變數以供lambda函式使用 2.pa...