Всякий раз, когда задействовано виртуальное наследование.
Пример:
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 может потребовать дальнейших изменений в стандарте (если только комитет не предвидел ситуацию и не удостоверился, что все совместимо с ней, и в этом случае должны быть некоторыеопять бумажный след).