Активация абстрактного класса через список инициализаторов
Я хотел бы понять, почему компилятор позволяет компилировать следующий код
#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
и завершение.
Ответы
Ответ 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({})
.