通过初始化列表实例化抽象类

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++程序

class A {
public:
    A() {
        printf("A()\n");
    }
    virtual void b() const = 0;
};
int main() {
    const A& a{};
    a.b();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您的代码与此行的功能相同

const A& a{}
Run Code Online (Sandbox Code Playgroud)

作为g({})调用的一部分.