我想了解为什么编译器允许编译以下代码
#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({})
with g(A())
它显然无法编译。它抱怨说A
是抽象的,无法实例化。 Clang 和 GCC 都可以正常编译,没有任何警告。运行两个版本时打印pure virtual method called
并终止。
这看起来像一个已知的g++ 错误号 70939 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=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({})
调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)