Возможно, этот пример неработающего кода поможет проиллюстрировать:
Если я определю класс следующим образом:
class Connection {
boost::asio::tcp::ip::socket _socket;
boost::asio::io_service _io_service;
Connection() : _io_service(), _socket(_io_service)
{
}
};
Это не удастся во всех современных компиляторах.Поскольку _socket
определяется сначала как член класса, список инициализации попытается сначала его инициализировать, несмотря на тот факт, что список инициализации просит компилятор сначала инициализировать _io_service
.Но поскольку _io_service
еще не было инициализировано (конструктор сокета зависит от инициализированного _io_service
), инициализация _socket
вызовет ошибку segf.
Возможно, кто-то может процитировать соответствующий раздел стандартаэто диктует такое поведение.
Во второй половине вопроса базовые классы всегда будут инициализироваться до того, как классы получат своих членов.