назначение структуры с initializer_list в c ++ - PullRequest
0 голосов
/ 17 мая 2018

У меня есть структура

struct Data {
   int a,b;
   Data& operator=(Data &&other) = delete;
};

Теперь, когда я вызываю оператора присваивания

Data A[2];
A[0] = {1, 2};

Я получаю ошибку компиляции для вызова удаленной функции. У меня вопрос, как initializer_list преобразуется в rvalue ссылку типа Data?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Этот синтаксис описан в 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=.

0 голосов
/ 17 мая 2018

Мой вопрос заключается в том, как initializer_list преобразуется в rvalue-ссылку типа Data?

Если под initializer_list вы подразумеваете тип std::initializer_list, в вашем примере его нет. Вы используете инициализация списка для создания временного Data экземпляра ( prvalue , а не ссылка на значение) и присваиваете его A[0], что конечно, не удастся, так как оператор назначения перемещения удален.

Ваш пример идентичен

A[0] = Data{1, 2};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...