1. ホーム
  2. c++

[解決済み] メンバ変数内のイニシャライザ文字列から配列のサイズを推測できない理由は何でしょうか?

2022-02-16 06:04:16

質問

コードを考えてみましょう。

struct Foo
{
    const char str[] = "test";
};

int main()
{
    Foo foo;
}

g++とclang++の両方でコンパイルに失敗し、基本的に以下のように出力されます。

error: array bound cannot be deduced from an in-class initializer

おそらく標準ではそうなっているのだろうと理解していますが、何か特別な理由があるのでしょうか?文字列リテラルがあるので、コンパイラは何の問題もなくサイズを推測できるはずです。 const C言語ライクなNULL終端文字列。

どのように解決するのですか?

コンストラクタでクラス内イニシャライザリストをオーバーライドする可能性が常にあるからです。だから結局、非常に混乱する可能性があるのでしょうね。

struct Foo
{
   Foo() {} // str = "test\0";

   // Implementing this is easier if I can clearly see how big `str` is, 
   Foo() : str({'a','b', 'c', 'd'}) {} // str = "abcd0"
   const char str[] = "test";
};

を置き換えることに注意してください。 const charstatic constexpr char は完璧に動作しますし、おそらくあなたが望むことでしょう。