Когда базовый класс может иметь макет, отличный от соответствующего полного типа объекта? - PullRequest
13 голосов
/ 21 марта 2019

GCC и Clang не выполняют гарантированное копирование C ++ 17 при вызове конструктора базового класса; см. этот вопрос и соответствующий отчет об ошибке Clang для подробностей.

В ответ на сообщение об ошибке Ричард Смит заявляет :

Это ошибка в стандартной формулировке. Исключение копирования не может быть гарантировано при инициализации подобъекта базового класса, поскольку базовые классы могут иметь разную компоновку, чем соответствующий полный тип объекта.

При каких обстоятельствах базовый класс может иметь «макет, отличный от соответствующего полного типа объекта» таким образом, что делает невозможным гарантированное удаление копии? Есть конкретный пример, который иллюстрирует это?

1 Ответ

6 голосов
/ 21 марта 2019

Всякий раз, когда задействовано виртуальное наследование.

Пример:

struct A {
   int a;
   A (int a) : a(a) {}
};

struct B:  virtual A {
   B() : A(0) {}
};


B makeB { return B(); }

struct C : B {
  C() : B(makeB()), A(42) {}
};

Конструктор C инициализирует подобъект A, поэтому конструктор B не может.Как бы makeB узнал, должна ли она инициализировать A?

В этом случае теоретически возможно удаление копии.Реализация должна была бы прозрачно создать две двоичные версии makeB или добавить невидимый аргумент в makeB (т. Е. Использовать технику, используемую для самих конструкторов), чтобы она могла создать B с инициализацией A или без нее.Однако для этого может потребоваться несовместимое изменение ABI.

В стандарте могут быть или не быть дефекты.Эта ситуация, вероятно, не была предусмотрена комитетом.Если бы это было так, я был бы рад прочитать обсуждение, так как оно, несомненно, оставило бумажный след.Таким образом, намерение неясно, пока нет разъяснений от комитета.Если намерение состоит в том, чтобы в этом случае исключить возможность копирования, проклятие несовместимости ABI может потребовать дальнейших изменений в стандарте (если только комитет не предвидел ситуацию и не удостоверился, что все совместимо с ней, и в этом случае должны быть некоторыеопять бумажный след).

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