Гарантируется всегда работать (я использую его довольно часто). Компилятор знает, что список инициализаторов имеет форму: member(value)
, и поэтому он знает, что первый vec
в vec(vec)
должен быть членом. Теперь в аргументе инициализации члена могут использоваться оба члена, аргументы конструктору и другим символам, как и в любом выражении, которое будет присутствовать внутри конструктора. На этом этапе он применяет регулярные правила поиска, а аргумент vec
скрывает член vec
.
В разделе 12.6.2 стандарта рассматриваются инициализация, и в нем объясняется процесс с параграфом 2, касающийся поиск члена и параграфа 7 с поиском аргумента.
Имена в списке выражений mem-инициализатора оцениваются в объеме конструктора, для которого mem-initializer указано. [Пример:
blockquote>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) {} };