gpt4 book ai didi

c++ - 为什么 clang 和 gcc 在这个虚拟继承代码上意见不一?

转载 作者:行者123 更新时间:2023-11-30 01:41:58 25 4
gpt4 key购买 nike

我发现 clang 3.8.0 和 gcc 6.2.1 在处理我认为有效代码的方式上存在一些差异。这是一个示例,clang++ --std=c++11 vitest.cpp 编译时没有注释:

#include <iostream>

class Processor {
public:
Processor( int i, float f ) {}

virtual ~Processor() noexcept {}

virtual void getStatistics() = 0;
};

class PageProvider : virtual public Processor {
public:
PageProvider( int i, float f )
// : Processor{i,f} // Without this, GCC wants to call default ctor
{}

virtual ~PageProvider() {}
};

class QuotePageProvider : public PageProvider {
public:
QuotePageProvider( int i, float f )
: Processor{i,f},
PageProvider{i,f}
{}

virtual void getStatistics() { std::cout << "Hi there" << std::endl; };
};

int main( int argc, char* argv[] )
{
PageProvider* prov2{new QuotePageProvider{1,2.2}};
prov2->getStatistics();
delete prov2;
}

第一个异常是 g++(具有相同的命令行参数)提示 PageProvider 构造函数:

vitest.cpp:16:2: error: no matching function for call to ‘Processor::Processor()’

这可以通过取消注释 Processor 的显式初始化来解决,如上所示。根据aschepler's answer下面,这是一个已知的 gcc 错误。

去掉这些,事情变得更有趣了:

vitest.cpp: In constructor ‘QuotePageProvider::QuotePageProvider(int, float)’:
vitest.cpp:25:20: error: cannot allocate an object of abstract type ‘PageProvider’
PageProvider{i,f}
^
vitest.cpp:12:7: note: because the following virtual functions are pure within ‘PageProvider’:
class PageProvider : virtual public Processor {
^~~~~~~~~~~~
vitest.cpp:9:15: note: virtual void Processor::getStatistics()
virtual void getStatistics() = 0;
^~~~~~~~~~~~~

似乎 gcc 坚持要在 PageProvider 中实现 getStatistics() 以编译 QuotePageProvider,而 clang 则没有。我得到相同的编译结果 with gcc 5.1 .

我可以通过执行以下任一操作说服 gcc 编译代码:

  • PageProvider 的构造函数的参数数量减少到 1(不考虑类型)。
  • 使 PageProviderProcessor 的继承成为非虚拟的。
  • QuotePageProvider 的构造函数的初始化列表中,将 PageProvider 的初始化更改为使用括号而不是花括号。对上面 Processor 的初始化进行的类似更改没有任何效果。

这是否可能是标准中的一些奇怪的极端情况,两个编译器的解释不同,或者其中一个被破坏了?

最佳答案

这是 gcc 错误 53878 .

抽象类不需要构造它的虚拟基类。

关于c++ - 为什么 clang 和 gcc 在这个虚拟继承代码上意见不一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com