无意中实例化'使用大括号初始化器的抽象类类型?

时间:2017-02-03 18:49:52

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

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

#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;
}

到目前为止,我预计编译器会发出类似于在尝试调用IFoo()IFoo{}之类的内容时所遇到的错误。但是,上面的代码在没有警告的情况下编译(在gcc 6.2上),但显然会以&#39; 纯虚方法&#39;来终止。只要您尝试调用getFoo()方法。 Live example

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

1 个答案:

答案 0 :(得分:5)

这是一个known GCC bug。不幸的是,这个问题仍然存在,并没有分配给任何人,似乎。