我想了解为什么编译器允许以下代码编译
#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
并终止。
答案 0 :(得分:15)
这看起来像一个已知的g++ bug number 70939:
在g ++的所有版本中创建允许抽象类的对象
g ++成功编译了错误的C ++程序
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({})
调用的一部分。