Подтвердить что ты не робот

Активация абстрактного класса через список инициализаторов

Я хотел бы понять, почему компилятор позволяет компилировать следующий код

#include <iostream>

struct A
{
    A()
    {
        std::cout << "A::A\n";
    }

    virtual void f() const = 0;
};

void g(const A& a)
{
    a.f();
}

int main()
{
    g({});
}

Он даже выводит A::A при запуске.

Если я заменил g({}) на g(A()), он явно не компилируется. Он жалуется, что A является абстрактным и не может быть создан. Оба Clang и GCC собирают этот штраф без каких-либо предупреждений. При запуске обеих версий печать pure virtual method called и завершение.

4b9b3361

Ответ 1

Это выглядит как известный g++ номер ошибки 70939:

создание объекта абстрактного класса, разрешенного во всех версиях g++

g++ компилирует плохо сформированную С++-программу успешно

class A {
public:
    A() {
        printf("A()\n");
    }
    virtual void b() const = 0;
};
int main() {
    const A& a{};
    a.b();
    return 0;
}

Ваш код делает то же самое, что и эта строка

const A& a{}

как часть вызова g({}).