使用在初始化列表中先前初始化的成员初始化成员是否安全?

时间:2012-12-08 16:20:11

标签: c++ constructor initialization undefined-behavior

以下代码是安全的还是会导致C ++ 03中的未定义行为?

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

private:
    string Taurus;
    const string Leo;
};

这段代码显然是我实际问题的精简版。

编辑 Taurus已在类声明中Leo之前故意声明。我知道初始化是按类声明中的初始化顺序发生的(而不是初始化列表中的顺序。)

2 个答案:

答案 0 :(得分:2)

是的,您可以安全地使用在初始化成员之前初始化的成员。

请注意,初始化顺序是类定义中声明的顺序。

答案 1 :(得分: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

这不是一个通用的解决方案,也不是一个非常理想的习惯用语,但仍然可以提供帮助并且相对干净。