Интересно, что об этом говорит стандарт C ++? Является ли законным и гарантированным всегда работать?
blockquote>Да. Это совершенно законно. Полностью стандартное соответствие.
Blah(std::vector<int> vec): vec(vec){} ^ ^ | | | this is the argument to the constructor this is your member data
Поскольку вы попросили ссылку в стандарте, вот пример.
§12.6.2 / 7
< blockquote>Имена в списке выражений mem-инициализатора оцениваются в области конструктора, для которого указан mem-инициализатор.
blockquote>[Example: class X { int a; int b; int i; int j; public: const int& r; X(int i): r(a), b(i), i(i), j(this->i) {} //^^^^ note this (added by Nawaz) };
инициализирует X :: r для ссылки на X :: a, инициализирует X :: b со значением параметра конструктора i, инициализирует X :: i с значение параметра конструктора i и инициализирует X :: j значением X :: i; это происходит каждый раз, когда создается объект класса X. ]
[Примечание: поскольку mem-инициализатор оценивается в области конструктора, этот указатель может использоваться в списке выражений mem-initializer для ссылки на инициализированный объект. ]
blockquote>Как вы можете видеть, в приведенном выше примере есть и другая интересная вещь, и комментарий к самому стандарту.
BTW, как сторона примечания, почему вы не принимаете параметр в качестве ссылки const :
Blah(const std::vector<int> & vec): vec(vec) {} ^^^^const ^reference
Он избегает ненужной копии исходного векторного объекта.