2012-12-08 1 views
2

Является ли следующий код безопасным или приводит к неопределенному поведению в C++ 03?Можно ли инициализировать элемент с помощью члена, инициализированного ранее в списке инициализаторов?

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

private: 
    string Taurus; 
    const string Leo; 
}; 

Этот код, очевидно, является урезанной версией моей реальной проблемы.

РедактироватьTaurus было объявлено до Leo в декларации класса. Мне известно, что инициализация происходит в порядке инициализации в объявлении класса (а не в списке в списке инициализаторов.)

+2

Этот код имеет безопасное, четкое поведение, но только потому, что 'Taurus' является _declared_ первым. – ildjarn

+0

@ildjarn Да, я знаю, что инициализация происходит в порядке объявления в классе, а не в порядке в списке инициализаторов. Спасибо, что поняли это. –

+0

Будучи в безопасности, я бы не рекомендовал его. Некоторые комментарии рядом с объявлениями переменных будут очень хорошими. –

ответ

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 

Это не является универсальным решением или очень желательно идиома, но все еще может быть полезным и относительно чистые.

+0

Как вы уже упоминали, это не универсально, но это, безусловно, хорошая идиома, чтобы знать. Благодарю. –

2

Да, вы можете безопасно использовать элементы, инициализированные до инициализации элемента.

Обратите внимание, что порядок инициализации - это порядок объявления в определении класса.

+0

+1 для примечания о том, откуда приходит инициация инициализации. –