gcc 4.7中的bug?或不,我不确定所以我在这里问

时间:2012-06-06 16:02:25

标签: c++ gcc c++11

在此代码段中:

template<class T, int Min, int Max>
class Range
{
    const T min_ = Min; // works without const

    T max_ = Max;

};

我收到了错误

  

没有ctor的类中的非静态const成员

但如果我在课堂上初始化它,那就无关紧要了。这应该记录为错误吗?

2 个答案:

答案 0 :(得分:2)

是。隐式构造函数包括那些初始值设定项,因此不会发生错误。 §12.1/ 6:

  

隐式定义的默认构造函数执行该类的初始化集合,该初始化集合将由该用户编写的默认构造函数执行,该类没有ctor-initializer(12.6.2)和一个空的复合语句。如果用户编写的默认构造函数不正确,则程序格式不正确。

和12.6.2 / 8:

  

在非委托构造函数中,如果给定的非静态数据成员或基类未由mem-initializer-id指定(包括没有mem-initializer-list的情况,因为构造函数没有ctor -initializer)并且实体不是抽象类的虚拟基类(10.4),然后是

     

- 如果实体是具有大括号或等于初始化程序的非静态数据成员,则按照8.5中的规定初始化该实体;

答案 1 :(得分:2)

您收到警告并非错误,但您可能正在使用-Werror将其转换为错误。您应该学会区分,如果警告没用,您可以禁用错误。警告显示行末的相关警告选项,例如在这种情况下[-Wuninitialized],而-Werror会导致编译器打印:

cc1plus: all warnings being treated as errors

-Werror=uninitialized

cc1plus: some warnings being treated as errors

警告不正确,因此我将其报告为错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53594