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