This question already has an answer here:
Why do gcc and clang allow me to construct an abstract class?
(1个答案)
4年前关闭。
今天,我偶然发现了以下问题。有人太喜欢花括号初始化器了,不小心尝试实例化一个接口(interface)类。忍受我:
到现在为止,我一直希望编译器会发出类似于您尝试调用
有人可以向我解释那里发生了什么吗?
(1个答案)
4年前关闭。
今天,我偶然发现了以下问题。有人太喜欢花括号初始化器了,不小心尝试实例化一个接口(interface)类。忍受我:
#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()
方法时,显然会以名为的纯虚拟方法终止。 Live example。有人可以向我解释那里发生了什么吗?
最佳答案
这是一个known GCC bug。不幸的是,问题似乎仍然存在,并且尚未分配给任何人。
关于c++ - 偶然使用大括号初始化器 'instantiate'抽象类类型? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42031097/
10-10 14:19