今天我偶然发现了以下问题。有人太喜欢大括号初始化器并且不小心试图实例化接口类。忍受我:
#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。
有人可以向我解释那里发生了什么事吗?