我想了解为什么编译器允许以下代码编译
#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
并终止。
最佳答案
这看起来像是一个已知的 g++ bug number 70939 :
creating object of abstract class allowed in all versions of g++
g++ compiles ill formed C++ program successfully
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({})
调用的一部分。
关于c++ - 通过初始化列表实例化抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392541/