2016-02-28 31 views
0

我正在使用Wt :: WFormModel,其示例代表字段名稱爲static const char*'s。我一次對我的項目進行了一系列更改,其中一項更改了字段表示形式爲constexpr。很多故障排除之後,我發現這個聲明the WFormModel documentation爲什麼constexpr沒有獨特的價值或存儲空間?

字段類型爲const char *,和而不是字符串比較 識別領域,使用指針比較。因此,你應該確實應該在整個代碼中使用相同的字段常量來引用給定的 字段,並且不能使用C++ 11 constexpr作爲字段常量,因爲 沒有唯一值(因爲它沒有存儲空間) 。

constexpr char*的表示與const char*的表示相比如何?

+0

'constexpr'是最高級的,即'constexpr char * p;'與'char * constexpr p;'相同。表示方式沒有區別(標準說'char *'和'char const *'必須具有相同的大小和表示形式)。 –

+0

@PreferenceBean看來不懂constexpr的人是誰寫了引用文本的人! –

回答

2

這是出於同樣的原因,這並不一定工作:

const char *lit1 = "foo"; 
const char *lit2 = "foo"; 
assert(lit1 == lit2); 

編譯器可以識別這兩種文字其實都是相同的值,並在這樣做給他們相同的存儲。但它可能不會。而標準並不要求它。

而且如果lit1lit2在不同的文件中,那麼賦予它們相同的指針值從編譯器技巧變爲鏈接器技巧。這是不太可能發生的。

想想constexpr的一種方法是創建文字的複雜方式。因此,constexpr變量就像一個文字;其存儲(如果有的話)不受任何一個翻譯單元或使用點的約束。編譯器/鏈接器可以將它們整理在一起......或者它不能。該標準並不要求他們這樣做。