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

时间:2016-09-08 13:40:27

标签: c++ c++11 abstract-class language-lawyer

我想了解为什么编译器允许以下代码编译

#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({})替换为g(A()),则显然无法编译。它抱怨A是抽象的,无法实例化。 Clang和GCC都在没有任何警告的情况下编译此罚款。运行时,两个版本都打印pure virtual method called并终止。

1 个答案:

答案 0 :(得分:15)

这看起来像一个已知的g++ bug number 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({})调用的一部分。