簡體   English   中英

Clang編譯工作,而gcc不用於鑽石繼承

[英]Clang compilation works while gcc doesn't for diamond inheritance

我不確定我是否在這里遺漏了一些東西,但似乎下面的代碼(類似的代碼可以找到我再也找不到的另一個答案,這里的問題是不同的)編譯就好了鏗鏘不是為gcc編譯

#include <iostream>
using namespace std;

class base {
public:
 base(int i) {};

private:
 base(){};
};

class derivedA: virtual public base {
public:
 derivedA(int i) : base(i) {};

protected:
  derivedA() : base(0) {};
};

class derivedB: virtual public base {
public:
 derivedB(int i) : base(i) {};

protected:
  derivedB() : base(0) {};
};

class derivedAB : public derivedA, public derivedB {
public:
 derivedAB(int i) {};
 virtual ~derivedAB() = 0;
};

derivedAB::~derivedAB() {};

class lastDerived : public derivedAB {
public:
    lastDerived() : base(1), derivedAB(0) {};
};

int main(){
        lastDerived obj;
}

gcc正在報道

main.cpp: In constructor 'derivedAB::derivedAB(int)':
main.cpp:9:2: error: 'base::base()' is private
  base(){};

哪一個是正確的行為? 我會說gcc是一個,但我不確定為什么。

抽象類的虛基類不需要在該抽象基類的構造函數的mem-initializer-list初始化

這將在12.6.2p8中討論:

[...]並且實體不是抽象類的虛擬基類[...]
[ 注意:抽象類(10.4)永遠不是最派生的類,因此它的構造函數永遠不會初始化虛擬基類,因此可以省略相應的mem-initializers。 - 結束說明 ]

所以clang是正確的,gcc是不正確的。 這將是不同的derivedAB不抽象。


DR 257以來,這是C ++ 11中的新容差; g ++對於C ++ 03是正確的。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=19249上有一個gcc錯誤; 也許它可以用戳戳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM