とconstの配列を含む構造体を初期化します。は、私はC++ 11と協力し、以下の構造体を含むクラスを持つ初期化子リスト
struct Settings{
const std::string name;
const std::string* A;
const size_t a;
};
class X {
static const Settings s;
//More stuff
};
私はこの
のようにそれを定義したい.cpp
ファイルで
X::s = {"MyName", {"one","two","three"}, 3};
しかし、これは動作しません。しかし、中間変数を使用して動作します
const std::string inter[] = {"one","two","three"};
X::s = {"MyName", inter, 3};
中間変数なしで行う方法はありますか?
あなたの構造体*にはconst配列は含まれていません。これは、const文字列へのポインタを含んでいます。そのことを念頭に置いて、なぜ "中間変数"が必要かを理解することは容易です。 – juanchopanza
@juanchopanza:まあ、 'A'がconst配列(の始まり)を指し示したいと思っています。それは 'const std :: string'へのポインタでもありますが、私が望むものではありません。しかし、たぶん私はあなたが指しているものを得られないかもしれません。 – Haatschii
@Haatschii:配列とポインタが同じであるという考えで配列が崩壊するという事実を混乱させています。言語セマンティクスの面では、配列はポインタではありません。同様に、初期化子リストは配列ではありません。コンパイラはそのようなリストを持つ配列を初期化することができますし、配列をポインタに崩壊させることはできますが、あなたの例ではリストを配列に変換してそれをポインタに壊すことはわかりません。したがって、ポインタに代入する前に、イニシャライザリストを連続した配列に変換するために、仲介が必要です。 –