Почему виртуальный вызов чистой виртуальной функции из конструктора является UB, а вызов не чистой виртуальной функции разрешен стандартом?

Начиная с версии 10.4 Абстрактные классы параграф 6 Стандарта:

«Функции-члены могут быть вызваны из конструктора (или деструктора) абстрактного класса; эффект виртуального вызова чистой виртуальной функции прямо или косвенно для создаваемого (или уничтожаемого) объекта из такого конструктора (или деструктора) не определен »

. Предполагая, что вызов не чистой виртуальной функции из конструктора (или деструктора), разрешено Стандартом, почему разница?

[EDIT] Дополнительные цитаты из стандартов о чистых виртуальных функциях:

§ 10.4 / 2 Виртуальная функция указывается в чистом виде с помощью спецификатора чистоты (9.2) в объявлении функции в определении класса. Чистая виртуальная функция должна быть определена только в том случае, если вызывается с помощью или, как если бы с (12.4), синтаксис квалифицированного идентификатора (5.1). ... [Примечание: объявление функции не может содержать одновременно спецификатор pure и определение - конец примечания]

§ 12.4 / 9 Деструктор может быть объявлен виртуальным (10.3) или чистым виртуальный (10.4); если в программе создаются какие-либо объекты этого класса или любого производного класса, деструктор должен быть определен.

Вот некоторые вопросы, на которые необходимо ответить:

  • Если чистой виртуальной функции не была предоставлена ​​реализация, не должна ли это быть ошибка компилятора или компоновщика?

  • Если чистой виртуальной функции была предоставлена ​​реализация, почему в этом случае нельзя четко определить вызов этой функции?

17
задан Kara 28 June 2013 в 23:53
поделиться