C++: правила для инициализации возврата {}C++

Программы на C++. Форум разработчиков
Ответить
Гость
 C++: правила для инициализации возврата {}

Сообщение Гость »


Я пытаюсь понять правила, регулирующие следующую инициализацию:

struct A { константный символ* s_ptr; станд::строка ул; }; Фу() { возвращаться {}; } А = Фу(); Насколько я понимаю, a.s_ptr == nullptr и a.str — это «пустая» строка (с использованием конструктора строки по умолчанию).

Вот как я понимаю правила C++, определяющие этот результат.
Оператор
return {}; — это инициализация списка копирования (также упоминается здесь).

Поскольку A является агрегатом, применяется следующее правило:

(dcl.init.list#3.4) В противном случае, если T является агрегатом, агрегат инициализация выполнена

Я предполагаю, что версия 3.4 предшествует версии 3.5, поэтому она применяется в первую очередь.

Для агрегатной инициализации применяются следующие правила:

(dcl.init.aggr#5) Для агрегата без объединения каждый элемент, который не является явно инициализированный элемент инициализируется следующим образом:
[*](5.1) Если элемент имеет инициализатор члена по умолчанию ([class.mem]), элемент инициализируется из этого инициализатора.
[*](5.2) В противном случае, если элемент не ссылка, элемент инициализируется копированием из пустого список инициализаторов ([dcl.init.list]).
5.2 используется как для A::s_ptr, так и для A::str выше.

A::s_ptr инициализируется с использованием этого правила:

(dcl.init.list#3.11) В противном случае, если в списке инициализаторов нет элементов, объект инициализируется значением.

A::str инициализируется с использованием этого правила:

(dcl.init.list#3.5) В противном случае, если в списке инициализаторов нет элементов и T является типом класса с конструктором по умолчанию, объект инициализируется значением.

Правильно ли я понимаю?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»