【问题标题】:initialization of static member of template class模板类静态成员的初始化
【发布时间】:2016-03-10 07:42:42
【问题描述】:

考虑以下几点:

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 通行证:
msvc 2015 更新 1 错误:

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

每种情况下哪个编译器是对/错的?

【问题讨论】:

  • 有趣的问题;我在我的电脑上用 VS2015 试了一下,得到了相同的结果。案例 1 有效,案例 2 给出了相同的编译器错误。
  • 案例1是CWG 253。案例 2 是 MSVC 错误(= {} 似乎适用于 MSVC)。

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


【解决方案1】:

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

  1. ...如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应为具有 用户提供的默认构造函数

所以 clang 正确地报告了诊断消息。

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

【讨论】:

    【解决方案2】:
    typename A<T>::B
    

    是类型

    A<T>::
    

    是范围

    const A<T>::
    

    它是一个 const 范围吗?

    应该是:

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

    【讨论】:

    • 我认为const intint const 是一样的。您的建议给出了相同的编译错误。
    • 对我来说它编译器完美,它必须是编译器错误(cygwin g++ 4.9.3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2021-10-21
    • 2019-05-03
    • 2011-01-21
    • 2011-01-19
    相关资源
    最近更新 更多