Явный конструктор в массиве объектов

#c 11

#c 11

Вопрос:

 struct Row
{
  Row() { puts("default"); }
  Row(const Row amp;other) { puts("copy"); }
  Row(Row amp;amp;other) { puts("move"); }
  explicit Row(int) { puts("conv. c'tor"); }  
};

int main()
{

  Row rs;   
  Row r[3] = {1, 3, rs};

  Row r3[3]{1, 3, rs}; // no conversion exists 

}
 

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

А также как массив объектов распределяется в памяти? Это то же самое, что массив скалярных типов? Если я отключу флаг конструкторов elide и удалю ключевое слово explicit, я получу conv, move, conv, move и copy в первом, а также то же самое во втором? кто-нибудь может это объяснить?

Комментарии:

1. Я не уверен, что понимаю вопрос. Да, если вы сделаете конструктор преобразования явным, попытка неявного преобразования (как в Row r[3] = {1, 3}; ) приведет к ошибке. Другой вопрос, похоже, не имеет ничего общего с первым. Вероятно, это должен быть отдельный вопрос.

2. Вопрос в том, имеет ли агрегированная инициализация тот же эффект, что и инициализация копирования при инициализации массива объектов?

Ответ №1:

C 11 dcl.инициализация #14

Инициализация, которая происходит в форме T x = a;, а также при передаче аргументов, возврате функции, создании исключения ([except.throw]), обработке исключения ([except.handle]) и инициализации агрегированного элемента ([dcl.init.aggr]), называется copy-инициализация.

Инициализация агрегированного элемента — это инициализация копирования, а не прямая инициализация.