我想了解为什么编译器允许以下代码进行编译
#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(A())
替换 g({})
,显然它无法编译。它会抱怨说 A
是抽象的并且不能被实例化。但是,无论是 Clang 还是 GCC 都可以编译这个代码而不产生任何警告。运行时,两个版本都打印出 pure virtual method called
并终止。
{}
合法的规则很奇怪。实现这些奇怪的规则似乎在gcc和clang中留下了漏洞。 - Yakk - Adam Nevraumont