1

在此代码段中:

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

    T max_ = Max;

};

我收到错误

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

但如果我在一个类中初始化它,这无关紧要。应该将其记录为错误吗?

4

2 回答 2

2

是的。隐式构造函数包括那些初始化程序,因此不会发生错误。§12.1/6:

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

和 12.6.2/8:

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

— 如果实体是具有大括号或等号初始化器的非静态数据成员,则实体按照 8.5 中的规定进行初始化;

于 2012-06-06T16:06:04.843 回答
2

您收到的是警告而不是错误,但您可能正在使用-Werror将其变成错误。您应该学会区分差异,因此如果警告无用,您可以禁用错误。警告在行尾显示相关的警告选项,例如[-Wuninitialized]在这种情况下,并-Werror导致编译器打印:

cc1plus: all warnings being treated as errors

或为-Werror=uninitialized

cc1plus: some warnings being treated as errors

The warning is incorrect, so I've reported it as a bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53594

于 2012-06-06T16:53:13.640 回答