賞金將在 4 天后到期。此問題的答案有資格獲得 100聲望賞金。 清單正在尋找來自信譽良好的來源的答案:
如果有人可以解釋根據官方 C 標準是否允許“constexpr int”,那就太好了。
通常我喜歡在型別后面加上“const”,因為
int const foo1 = 123;
現在,如果我想宣告第二個變數(甚至應該是 constexpr),我想使用相同的樣式:
int constexpr foo2 = 123;
但是,這導致在運行代碼分析工具時出現警告(但是,我嘗試的所有編譯器都接受它)。C 標準是否要求 constexpr 只能在實際型別之前使用?
uj5u.com熱心網友回復:
constexpr是一個decl-specifier,就像int和一樣const。
其他decl 說明符例如thread_local, mutable, extern, virtual, extern, friend, typedef, consteval, constinitand inline,以及其他型別說明符,例如volatile, long, double, auto, signed, , 型別名稱,由, , ,decltype(...)引入的型別等。classenumunionstruct
decl-specifiers序列構成宣告的decl-specifier-seq。在decl-specifier-seq之后通常是一個宣告符串列,用逗號分隔,它們宣告具有給定 decl-specifiers 的物體。(但例如*inint* s;是宣告符的一部分,而不是說明符序列。)
我認為標準中沒有任何實體說明decl-specifier-seq的順序有任何相關性。例如,以下編譯沒有問題,并且應該與說明符的常規順序具有相同的含義:
struct { double volatile mutable long x = 1; } typedef const S;
inline S thread_local constexpr *s = {};
請參閱 C 標準的 C 20 后草案,第[dcl.spec]部分。它指定了 decl-specifier-seq 和各個說明符的語法。在本節的其余部分中,某些說明符的組合是被禁止的,但沒有提到它們的順序。
所以
int constexpr x;
和
constexpr int x;
是等價的。
但不可能的是例如
int* constexpr x;
這里constexpr將是宣告符的一部分。它可以寫成
int constexpr* x;
盡管。
我想這使得constexpr在型別說明符之后放置作為規則令人困惑。它與 for 的規則相同const,但constexpr應該只適用于整個宣告,而不適用于型別或子型別。
我認為代碼分析工具很可能只是在抱怨樣式而不是語法的功能。將型別說明符放在constexpr后面是不常見的,因為將 eg 放在const兩者之間是不常見long的long long,如果說明符的順序不常見,則可能難以閱讀代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415296.html
標籤:
上一篇:Javascript——ES6( ECMAScript 6.0)語法
下一篇:從零打造一個Web地圖引擎
