初始化模板类的静态成员

时间:2015-12-05 11:15:09

标签: c++ c++11 visual-c++ gcc clang

请考虑以下事项:

template<class T>
struct A
{
  struct B
  {} static const b;
};

// case 1
template<class T>
typename A<T>::B const A<T>::b;

// case 2
template<class T>
typename A<T>::B const A<T>::b{};

int main()
{
  A<int> a;
  a.b;
  return 0;
}

情形1:

gcc 5.2通过
msvc 2015更新1通过
clang 3.7错误:

default initialization of an object of const type 'const typename A<int>::B' without a user-provided default constructor

情况2:

gcc 5.2通过
clang 3.7 pass:
msvc 2015更新1错误:

error C2143: syntax error: missing ';' before '<end Parse>'

每种情况下哪种编译器是对还是错?

2 个答案:

答案 0 :(得分:1)

根据C ++标准(8.5初始化程序)

  1. ...如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有 用户提供的默认构造函数
  2. 所以clang正确报告了diagnostoc消息。

    至于第二种情况,那么似乎使用的MS编译器不支持列表初始化或有错误。

答案 1 :(得分:0)

typename A<T>::B

是类型

A<T>::

是范围

const A<T>::

是const范围吗?

应该是:

const typename A<T>::B A<T>::b;