2017-03-08 14 views
-1

定数:宣言文字列を宣言することの利点は何

static constexpr const char* K = "k"; 

対:

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

おかげ

大きな違いがあります
+0

まあ最初のものは明らかにコンパイル時の定数式ですが、2番目のものは実行時に動的メモリを割り当てます。それはすべてあなたのユースケースに依存します。 – DeiDei

+0

したがって、最初のフォームの決定的な利点はありませんか? – Ted

答えて

0

、それはあなたのコードにどのように影響するかを多くのものに依存します。一般的には、std :: stringオブジェクトがいつ構築されるか、または破棄されるかを保証することができないため、2番目の方法はお勧めできません。

それは最高のGoogle C++ Style Guideで加算される:静的記憶域期間を持つクラス型の

変数は禁止されています。彼らは、建設と破壊の不確定順序による見つけにくいバグを引き起こします。ただし、そのような変数はconstexprの場合に許可されます。動的初期化または破壊はありません。

グローバル変数、静的変数、静的クラスメンバー変数、および関数静的変数を含む静的記憶域を持つオブジェクトは、PIR(Plain Old Data)でなければなりません。int、chars、float、またはポインタ、または配列/ PODの

彼らは、第二の禁止:

我々は唯一の静的変数はPODデータを含めることができ、結果として。このルールは、std :: vector(Cの配列を代わりに使用する)、またはstring(const char []を使用)を完全に禁止します。

+0

GoogleはC++の権威としては見られないことに注意してください。例えば、 'std :: vector'の代わりにC配列を使うことは、' std :: array'を完全に無視していることを示唆しています。 – MSalters

関連する問題