det*_*zed 24 c++ abstract-class language-lawyer c++11
我想了解为什么编译器允许以下代码进行编译
#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({});
}
Run Code Online (Sandbox Code Playgroud)
它甚至A::A
在运行时输出.
如果我更换g({})
与g(A())
它显然不会编译.它抱怨它A
是抽象的,无法实例化.Clang和GCC都在没有任何警告的情况下编译此罚款.运行时,两个版本都打印pure virtual method called
并终止.
das*_*ght 14
这看起来像一个已知的g ++错误号70939:
在所有版本的g ++中创建允许抽象类的对象
g ++成功编译了错误的C++程序
Run Code Online (Sandbox Code Playgroud)class A { public: A() { printf("A()\n"); } virtual void b() const = 0; }; int main() { const A& a{}; a.b(); return 0; }
您的代码与此行的功能相同
const A& a{}
Run Code Online (Sandbox Code Playgroud)
作为g({})
调用的一部分.
归档时间: |
|
查看次数: |
293 次 |
最近记录: |