2017-03-08 170 views
-1

什麼是宣佈的優勢:聲明字符串常量

static constexpr const char* K = "k"; 

與:

static const std::string K("k"); 

感謝

+0

那麼,第一個顯然是編譯時常量表達式,而第二個在運行時分配動態內存。這完全取決於你的用例。 – DeiDei

+0

因此,第一種形式沒有明確的優勢? – Ted

回答

0

有一個很大的區別,它是如何影響你的代碼取決於許多因素。通常第二個不推薦,因爲你不能保證什麼時候std :: string對象會被構造或者被破壞。

它最好由Google C++ Style Guide總結:

具有靜態存儲類類型的變量是被禁止的:他們會由於建設和毀滅的不確定的順序難以發現漏洞。但是,如果這些變量是constexpr,則允許使用這些變量:它們沒有動態初始化或破壞。

具有靜態存儲持續時間的對象,包括全局變量,靜態變量,靜態類成員變量和函數靜態變量,必須爲普通舊數據(POD):只有整數,字符,浮點數或指針或數組/結構的POD。

他們禁止第二:

因此,我們只允許靜態變量包含POD數據。這個規則完全禁止使用std :: vector(改用C數組)或string(使用const char [])。

+0

請注意,Google不被視爲C++的權威機構。例如,建議使用C數組替代'std :: vector'完全忽略'std :: array'。 – MSalters