С ++ 11 Делегированный конструктор Чистый виртуальный вызов методов и функций - опасность?

Не дубликатВызов виртуальной функции и чисто виртуальной функции из конструктора:

Предыдущий вопрос относится к C ++ 03, а не к новому поведению делегирования конструктора в C ++ 11, и этот вопрос не касается смягчения неопределенного поведения путем использования делегирования для обеспечения правильной конструкции перед выполнением чисто виртуальных реализаций.

В C ++ 11, какова опасность вызова функций Pure Virtual в конструкторе класса во время конструирования, но после того, как класс / объект был «полностью создан» посредством делегирования конструктора?

По-видимому, где-то в спецификации C ++ 11 такое ограничение существует,

Функции-члены (включая виртуальные функции-члены, 10.3) могут быть вызваны для строящегося объекта. Точно так же строящийся объект может быть операндом оператора typeid. - 12.6.2 # 13 [C ++ Working Draft] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) Не удается найти версию опубликованных спецификаций "добросовестного использования".

C ++ 11 рассматривает объект, созданный после завершения выполнения любого конструктора. Поскольку разрешено выполнение нескольких конструкторов, это будет означать, что каждый конструктор делегата будет выполняться для полностью сконструированного объекта своего собственного типа. Конструкторы производных классов будут выполняться после завершения делегирования в их базовых классах. -Википедия говоря, что это вещь C ++ 11.

Актуальный C ++ 11 Ссылка неизвестна.

Следующий пример компилирует и запускает в ноябре CTP компилятора Visual Studio 2012 C ++:

#include <string>

/**************************************/
class Base
{
public:
    int sum;
    virtual int Do() = 0;

    void Initialize()
    {
        Do();
    }
    Base()
    {
    }
};

/**************************************/
// Optionally declare class as "final" to avoid
// issues with further sub-derivations.
class Derived final : public Base
{
public:

    virtual int Do() override final
    {
        sum = 0 ? 1 : sum;
        return sum / 2 ; // .5 if not already set.
    }

    Derived(const std::string & test)
        : Derived() // Ensure "this" object is constructed.
    {
        Initialize(); // Call Pure Virtual Method.
    }
    Derived()
        : Base()
    {
        // Effectively Instantiating the Base Class.
        // Then Instantiating This.
        // The the target constructor completes.
    }
};




/********************************************************************/
int main(int args, char* argv[])
{
    Derived d;
    return 0;
}

Ответы на вопрос(2)

Ваш ответ на вопрос