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