2

次のコードは安全ですか、それともC ++ 03で未定義の動作につながりますか?

class Aries {
public:
    Aries() : Taurus("foo") , Leo(Taurus + "bar") {}

private:
    string Taurus;
    const string Leo;
};

このコードは明らかに私の実際の問題の簡略版です。

編集 は、クラス宣言のTaurus前に意図的に宣言されています。Leo初期化は、クラス宣言の初期化の順序で行われることを認識しています(初期化子リストの順序ではありません)。

4

2 に答える 2

2

コメントで述べた代替案を明確にするために:

class Aries {
public:
    friend Aries makeAries() {
        string Taurus = "foo"; // easier to do computations here:
        return Aries( Taurus, Taurus + "bar" );
    }

private:
    Aries( string const &inTaurus, string const &inLeo )
        : Taurus(inTaurus) , Leo(inLeo) {}

    string Taurus;
    const string Leo;
};
Aries makeAries(); // must declare a friend factory outside the class

これは普遍的な解決策でも本当に望ましいイディオムでもありませんが、それでも有用で比較的クリーンなものになる可能性があります。

于 2012-12-08T16:39:47.333 に答える
2

はい、初期化するメンバーの前に初期化されたメンバーを安全に使用できます。

初期化の順序は、クラス定義での宣言の順序であることに注意してください。

于 2012-12-08T16:27:56.947 に答える