以下代码是安全的还是会导致C ++ 03中的未定义行为?
class Aries {
public:
Aries() : Taurus("foo") , Leo(Taurus + "bar") {}
private:
string Taurus;
const string Leo;
};
这段代码显然是我实际问题的精简版。
编辑 Taurus
已在类声明中Leo
之前故意声明。我知道初始化是按类声明中的初始化顺序发生的(而不是初始化列表中的顺序。)
答案 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
这不是一个通用的解决方案,也不是一个非常理想的习惯用语,但仍然可以提供帮助并且相对干净。