使用大括号初始化程序,实际上"实例化"一个抽象类类型?

djf*_*djf 16 c++ abstract-class c++11

今天我偶然发现了以下问题.有人太喜欢大括号初始化器并且不小心试图实例化接口类.忍受我:

#include <iostream>

class IFoo
{
public:
   virtual ~IFoo() = default;
   virtual bool getFoo() const = 0;
};

void processFoo(const IFoo &fooImpl)
{
    bool foo = fooImpl.getFoo();
    std::cout << "got foo " << foo << std::endl;
}

int main()
{
   processFoo({});  // <- why is this valid?!
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直期望编译器会发出类似于在尝试调用IFoo()或调用某些东西时所获得的错误IFoo{}.但是,上面的代码在没有警告的情况下进行编译(在gcc 6.2上),但是当你尝试调用该方法时,很明显会以" 纯虚方法调用 " 结束getFoo().实例.

有人可以向我解释那里发生了什么事吗?

Chr*_*ckl 5

这是一个已知的GCC错误.不幸的是,这个问题仍然是开放的,并没有分配给任何人,似乎.