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().实例.
有人可以向我解释那里发生了什么事吗?