C ++ неявный порядок конструктора копии члена-члена конструктора копирования - PullRequest
1 голос
/ 22 апреля 2020

Просто хочу перепроверить: стандарт C ++ гарантирует, что переменные-члены копируются в порядке объявления неявным конструктором копирования, верно? В следующем примере a копируется до b, верно? (Предположим, что и A, и B имеют нетривиальные конструкторы копирования, и для правильности важно, чтобы a было скопировано до копирования b.)

struct Foo {
  A a;
  B b;
};

Мне интересно, если это гарантируется стандартом или зависит от реализации?

1 Ответ

4 голосов
/ 22 апреля 2020

Да, порядок инициализации гарантирован для неявно определенного конструктора копирования :

Для типов классов, не являющихся объединениями (класс и структура), конструктор выполняет полный член- Мудрая копия баз объекта и нестатических c членов в порядке их инициализации с использованием прямой инициализации.

И порядок инициализации членов данных - это порядок их декларация.

3) Затем не-данные c члены данных инициализируются в порядке объявления в определении класса.

Из стандарта [class.copy.ctor] / 14

(выделено мной)

Неявно определенный конструктор копирования / перемещения для класса X без объединения выполняет элемент-член копирование / перемещение его баз и участников. [Примечание. Инициализаторы элементов по умолчанию для элементов данных, не относящихся к состоянию c, игнорируются. Смотрите также пример в [class.base.init]. - примечание к концу] Порядок инициализации такой же, как порядок инициализации баз и элементов в определяемом пользователем конструкторе (см. [class.base.init] ).

и [class.base.init] /13.3

Затем элементы данных c, не относящиеся к состоянию, инициализируются в том порядке, в котором они были объявлено в определении класса (опять же, независимо от порядка mem-инициализаторов ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...