gpt4 book ai didi

c++ - 派生类 : using Base class member in initializer list

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

第一段代码:

struct Base
{
int x{};
};

struct Derived :
Base
{
Derived()
: y{x}
{
}

int y;
};

int main()
{
Derived d;
}

编译良好:

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

第二段代码:

#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()
: y{x}
{
}

int y;
};

int main()
{
Derived<0> d;
}

编译良好:

不会编译:

要修复 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()
: y{base_t::x}
{
}

int y;
};

int main()
{
Derived<0> d;
}

看(vc也会编译):

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

谢谢

最佳答案

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

将其更改为简单的 this->x 也可以,所以这里 VC++ 是错误的。

关于c++ - 派生类 : using Base class member in initializer list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500130/

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