今天我遇到了以下问题。有人过于喜欢花括号初始化,并意外地尝试实例化一个接口类。请跟我一起看下去:
直到现在,我一直期望编译器会发出类似于尝试调用
请问有人能够友好地解释一下这是怎么回事吗?
#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上,以上代码可以编译而没有警告,但是一旦您尝试调用getFoo()
方法,它显然会终止并显示“pure virtual method called”。实时示例。请问有人能够友好地解释一下这是怎么回事吗?
int main() { const IFoo& foo = {}; return 0; }
抱歉无法格式化注释。...还有const IFoo& foo{};
也可以编译。 - Richard Critten