C++ 当gcc没有';钻石遗产税

C++ 当gcc没有';钻石遗产税,c++,inheritance,gcc,c++11,clang,C++,Inheritance,Gcc,C++11,Clang,我不确定我是否遗漏了一些东西,但似乎下面的代码(类似的代码可以在我再也找不到的另一个答案中找到,这里的问题是不同的)正在编译和更新 哪一个是正确的行为?我想说gcc是一个,但我不确定为什么。抽象类的虚拟基类不需要在该抽象基类的构造函数的mem初始值设定项列表中初始化 12.6.2p8中对此进行了讨论: […]并且实体不是抽象类的虚拟基类[…] [注:抽象类(10.4)永远不是最派生的类,因此其构造函数永远不会初始化虚拟基类,因此可以省略相应的mem初始值设定项。-结束注] 所以,叮当声是正确的,

我不确定我是否遗漏了一些东西,但似乎下面的代码(类似的代码可以在我再也找不到的另一个答案中找到,这里的问题是不同的)正在编译和更新


哪一个是正确的行为?我想说gcc是一个,但我不确定为什么。

抽象类的虚拟基类不需要在该抽象基类的构造函数的mem初始值设定项列表中初始化

12.6.2p8中对此进行了讨论:

[…]并且实体不是抽象类的虚拟基类[…]
[注:抽象类(10.4)永远不是最派生的类,因此其构造函数永远不会初始化虚拟基类,因此可以省略相应的mem初始值设定项。-结束注]

所以,叮当声是正确的,而gcc是错误的。如果
derivedAB
不是抽象的,这将是不同的



这是C++11中的一个新容差,因为;对于C++03来说,g++是正确的。有一个gcc错误在;也许这与戳有关。

What
返回0
main
不需要返回语句。进一步讨论:也相关:如果有人想知道VS2013报告的错误与GCC报告的错误相同,那么如果以后derivedA/derivedB发生更改,并且有人向derivedA和derivedB类添加了一个具有副作用的构造函数,该怎么办?不太容易维护。这需要修复derivedAB可能会破坏使用lastDerived或derivedAB的所有代码(没有编译器错误!),谢谢!现在它有意义了。
#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;
}
main.cpp: In constructor 'derivedAB::derivedAB(int)':
main.cpp:9:2: error: 'base::base()' is private
  base(){};