2013-02-25 38 views
11

你更換我是否應該儘可能在C++ 11中將'const int'替換爲'constexpr int'?

const int one = 1; 
const int two = 2; 

這個?

constexpr int one = 1; 
constexpr int two = 2; 

我的理解是正確的,這兩個塊具有相同的語義,它目前的味道只是一個事?

在另一方面,作爲constexpr意味着const,你可以認爲它是比較一致的總是傾向於更嚴格的形式,即使在平凡的情況下它不會有所作爲?

(據我所知,當右側的表達式被允許更復雜時,情況完全改變,因此爲了澄清,該問題僅關注表達式是固定整數的最簡單情況。)

+1

我能想到的唯一的事情是,如果你指定像一個API的東西,你可能會決定使用'常量int'存儲一個常量表達式作爲屬性可能不會在將來的版本舉行。 – Pubby 2013-02-26 00:00:53

回答

13

我覺得你的聲明說,constconstexpr具有相同的語義」應修改爲:它們都宣稱對象,它們的值不能改變,但constexpr也需要初始化表達式是在編譯時間計算。

現在,如果在右手側的表達式無法在編譯時計算,使用constexpr是不可能的。另一方面,只要初始化器是一個文字,你可以使用constexpr,但是要考慮你的變量的語義是什麼:你的常量變量是否真的代表了其值應該在編譯時可計算的東西,時間?

在軟件維護/演化光學,很可能你會改變你整個時間初始化變量的方式:今天初始化爲文字,明天它可能是一個更復雜的表達式。

不管你分配一個值現在順便說一下,你認爲i將永遠需要被其它的東西比文字進行初始化,並且初始化表達式可能無法在編譯時間計算的?如果是這種情況,那麼只需製作變量const即使您正在使用文字初始化它,否則,使其成爲constexpr

換句話說,選擇最能表達你的變量的語義預選賽。

+2

我會把最後的建議放在頭上:問問你自己:「這個名字是否需要在編譯時解決?」 (例如,我使用它作爲一個數組大小或枚舉值的某個地方。)如果是這樣,使用'constexpr'使得沒有人被試探來改變它的方式,這將導致使用的名稱的失敗。 – rici 2013-02-26 00:20:53

+3

@rici:有道理,但我認爲OP主要關注評論中問題的答案爲「否」的情況。當答案爲「是」時,肯定該變量應該是「constexpr」。但是如果初始化器不嚴格地需要一個'constexpr'表達式,現在恰好是一個呢?這是我試圖回答的問題。 – 2013-02-26 00:24:33

+0

不夠公平,但它似乎對我非常難以回答的問題是「可能'i'有一天需要用的東西比文字更復雜的初始化?「,並且很容易回答」編譯時需要知道'我'的問題嗎?「使用'constexpr'始終如一地指示後者向代碼讀取器提供有用的信息;使用'const'指示您想象一個可能的事實上的未來,不是那麼多 – rici 2013-02-26 00:27:44

相關問題