2015-12-28 66 views
9

我最近開始在我的代碼中使用更多的C++ 11功能,並且一直在懷疑constexpr關鍵字的位置是否會在常量的類型之前或之後產生區別。C++ constexpr關鍵字放置

風格1:

constexpr int FOO = 1; 
constexpr auto BAR = "bar"; 

風格2:

int constexpr FOO = 1; 
auto constexpr BAR = "bar"; 

樣式2是我喜歡的方式來放置const關鍵字,並把constexpr以同樣的方式會帶來一定的一致性到代碼。然而,這被認爲是不好的做法,或者是風格2有什麼不妥之處,因爲我真的沒有看到任何人寫這樣的。

回答

10

它是一個說明符,像long,short,unsigned等等,它們都可以移動。例如,下面是兩個等價的,有效的聲明:

int long const long unsigned constexpr foo = 5; 
constexpr const unsigned long long int foo = 5; 

按照慣例,不過,constexpr將類型名稱前出現。如果你把它放在後面,它會混淆他人,但它在技術上是有效的。由於constexpr的用途與const的用途不同,因此我認爲將它放在正確的位置不會有同樣的好處。例如,您不能執行int constexpr * constexpr foo。實際上,int constexpr * foo將不允許您重新指定foo,而不適用於foo指向的內容,因此如果您期望與const具有相同的語義,那麼將它放到正確位置可能會產生誤導。

總結:

int constexpr foo = 0; // valid 
int constexpr * constexpr foo = nullptr; // invalid 
int* constexpr foo = nullptr; // invalid 
int constexpr * foo = nullptr; // valid 
constexpr int* foo = nullptr; // valid and same as previous 
+0

只是關於措辭。 「_他們都可以被移動」 - 可以理解爲「_it並不重要,你把'const'_」放在哪裏,不是這樣,因爲它改變了含義。 – AlexD

+0

@AlexD,真的,我可能會過分簡化它一下。主要觀點是它們可以以任何順序出現在「基本類型」之前或之後(例如'int'),直到類似'*'的語法開始變得更具體。宣言語法不是最簡單的部分之一。 – chris

+0

當然。正如我所說,我的評論只是關於措辭:-)。 – AlexD

1

msdn的語法定義爲:

constexpr字面類型標識符=常數表達式; constexpr字面類型標識符{常數表達式}; constexpr文字類型標識符(params); constexpr ctor(params);

其中說你應該在左邊使用它。

編輯:

新符關鍵字constexpr是一個聲明說明;修改[ISO03,§7中的 語法。1]如下:

1可在聲明所使用的說明符是 DECL說明符:

存儲類說明符

類型說明符

功能說明符

朋友

typedef

constexpr

對此說明符here給出說明。

總結@chris的回答是對的:)