Во-первых, как уже упоминалось, это:
Matrix(size_t x, size_t y)
{
a(x, vector<int>(y , 0 ));
}
- это не то, как вы инициализируете участника.Чтобы инициализировать элемент, мы используем список инициализатора элемента , например:
Matrix(size_t x, size_t y)
: a(x, vector<int>(y , 0 ))
{}
Синтаксис двоеточия - это специальное место для перечисления инициализаций.Ничто в теле конструктора не является инициализацией.Когда вы не ставите инициализатор для члена, он инициализируется по умолчанию.Затем выполняется код в теле вашего конструктора.Как мы знаем, тело функции состоит из операторов , которые выполняются.
Теперь, когда вы выполняете оператор <name>(<thing>, <other thing>)
, это вызов функции.Если <name>
не функция, а экземпляр класса, то вместо этого ищется оператор вызова функции operator()
.Если его нет (или он не соответствует аргументам), то компиляция завершится не так, как вы наблюдали.
Возможно, язык был спроектирован так, что любое упоминание члена внутритело конструктора, в таком виде, рассматривалось как инициализация?Наверное.Но почему?Теперь у вас не было бы однозначного способа выполнять вызовы функций, и порядок, в котором все происходит во время конструирования, был бы неясен.Теперь все намного лучше.