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 является типом класса с конструктором по умолчанию, объект инициализируется значением.
Правильно ли я понимаю?
Я пытаюсь понять правила, регулирующие следующую инициализацию:
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 является типом класса с конструктором по умолчанию, объект инициализируется значением.
Правильно ли я понимаю?
Мобильная версия