Мотивация за списком инициализации обусловлена тем, что поле const содержит объект по значению (в отличие от поля ссылки / указателя).
Такие поля должны быть инициализированы ровно один раз (из-за их постоянства),Если бы в C ++ не было списка инициализации, то ctor мог бы выглядеть примерно так:
class A {
public:
const string s;
const string t;
A() {
// Access to either s or t is not allowed - they weren't initialized
s = "some-string";
// now you can access s but you can't access t
f(*this);
t = "some other string";
// From now you can access both ...
}
}
void f(A& a) {
// Can you access a.s or a.t?
cout << a.s << a.t;
}
Без списка инициализации ctor может передать частично инициализированный объект типа A
в функцию, и эта функцияне будет возможности узнать, какие поля еще инициализированы.Слишком рискованно и очень сложно проверить компилятору / компоновщику.