派生类:在初始化列表中使用基类成员

Posted

技术标签:

【中文标题】派生类:在初始化列表中使用基类成员【英文标题】:Derived class: using Base class member in initializer list 【发布时间】:2015-09-10 11:04:01 【问题描述】:

代码的第一个sn-p:

struct Base

    int x;
;

struct Derived :
    Base

    Derived()
        : yx
    
    

    int y;
;

int main()

    Derived d;

编译正常:

gcc (6.0.0) clang (3.8.0) vc++(Visual Studio 2013 更新 4,18.00.31101)

第二个sn-p代码:

#include <type_traits>

template<int N>
struct Base

    int x = N;
;

static const int When0 = -1;

template<int N>
struct Derived :
    std::conditional<N == 0,
        Base<When0>,
        Base<N>>::type

    Derived()
        : yx
    
    

    int y;
;

int main()

    Derived<0> d;

编译正常:

vc++

不会编译:

gcc clang

要修复 gcc 和 clang,我需要指定 x 的类:

#include <type_traits>

template<int N>
struct Base

    int x = N;
;

static const int When0 = -1;

template<int N>
struct Derived :
    std::conditional<N == 0,
        Base<When0>,
        Base<N>>::type

    using base_t = typename std::conditional<N == 0,
        Base<When0>,
        Base<N>>::type;

    Derived()
        : ybase_t::x
    
    

    int y;
;

int main()

    Derived<0> d;

看(vc也会编译):

clang gcc

问题:哪个编译器是正确的?对此有何标准?

谢谢

【问题讨论】:

在 Visual Studio 中禁用“语言扩展”(/Za) 会使其拒绝您的第二个 sn-p。经常使用的经验法则:当有疑问时,VC++ 是错误的。 【参考方案1】:

这是从模板派生类访问基类(非依赖)成员的标准问题。见this FAQ entry。

将其更改为简单的 this-&gt;x 也可以,因此 VC++ 在这里是错误的。

【讨论】:

以上是关于派生类:在初始化列表中使用基类成员的主要内容,如果未能解决你的问题,请参考以下文章

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

虚函数总结

C ++为所有派生类初始化抽象基类受保护成员

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

多继承 与 多重继承

可以通过[重复]在派生类中初始化受保护的基类成员