使用花括号初始化程序意外实例化抽象类类型?

16
今天我遇到了以下问题。有人过于喜欢花括号初始化,并意外地尝试实例化一个接口类。请跟我一起看下去:
#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”。实时示例
请问有人能够友好地解释一下这是怎么回事吗?

3
似乎这是 g++ 的缺陷。 - R Sahu
2
gcc 5.1编译简化的主函数int main() { const IFoo& foo = {}; return 0; } 抱歉无法格式化注释。...还有const IFoo& foo{};也可以编译。 - Richard Critten
@djf 看起来clang 5.0.0 HEAD可以正确地捕捉到在melpon的在线编译器上进行测试时出现的错误。 - greatwolf
1个回答

5

这是一个已知的GCC bug。不幸的是,该问题仍然未解决且没有被分配给任何人。


他们必须在等待标准采用某种默认实例化方式并且Scala证据宣布它是一项功能。 - bipll
感谢你找到那个链接,Christian。我一直在寻找已知问题,但没有找到任何相关的信息:) - djf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接