This question already has an answer here:
Why do gcc and clang allow me to construct an abstract class?

(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