次の定義の違いは何だろうと思っていました。
// file.cpp:
namespace n
{
static char const * const str1 = "hello";
static char const str2[] = "hello";
}
私が望む動作は、両方とも次のことを提供すると思います。
- どちらも不変データを参照します (データが文字定数であるため)
- どちらの変数も変更できません (str1 は * const として定義されており、str2 は左辺値として使用できない配列であるため?)
- それらは両方とも内部リンケージを持っています(静的を介して)
- どちらも名前空間スコープを持っています
- いずれかの文字列データへのポインターが別のモジュールで (ここで指定されていない関数を介して) 利用可能になった場合、それらの文字列のメモリは有効になります (str1 は文字列リテラルを指しているため、str2 は配列が名前空間で宣言されているためです)。範囲)
言語によって保証されている違いはありますか? 実装に依存する動作がある場合、異なるプラットフォームでの違いを調査するにはどうすればよいですか?
(この例では、これらの動作を std::string オプションと比較することに興味はありませんが、他の読者が興味を持っていると思われる場合は、それについても自由に話してください。)