在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...