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