Этот синтаксис описан в C ++ 17 [expr.ass] / 9:
A фигурный список инициализации может отображаться в правой части
- [...]
- присваивание объекту типа класса, в этом случае список инициализатора передается в качестве аргумента функции оператора присваивания, выбранной разрешением перегрузки.
с приведенным примером:
z = { 1,2 }; // meaning z.operator=({1,2})
Поведение предоставления braced-init-list в качестве аргументадля функции означает, что параметр функции инициализируется этим списком.В этом случае Data&& other
инициализируется {1, 2}
.Это рассматривается в [dcl.init.list] /3.4:
В противном случае, если T
является ссылочным типом, генерируется значение типа, на который ссылается T
.Значение prvalue инициализирует свой объект результата путем инициализации copy-list-initialization или direct-list-initialization, в зависимости от вида инициализации для ссылки.Затем значение prvalue используется для прямой инициализации ссылки.
Таким образом, существует значение типа Data
, инициализированное {1, 2}
, которое становится инициализатором для параметра operator=
.