在此代码段中:
template<class T, int Min, int Max>
class Range
{
const T min_ = Min; // works without const
T max_ = Max;
};
我收到错误
没有 ctor 的类中的非静态 const 成员
但如果我在一个类中初始化它,这无关紧要。应该将其记录为错误吗?
是的。隐式构造函数包括那些初始化程序,因此不会发生错误。§12.1/6:
隐式定义的默认构造函数执行类的一组初始化,这些初始化将由用户编写的该类的默认构造函数执行,没有 ctor-initializer (12.6.2) 和空的复合语句。如果该用户编写的默认构造函数格式不正确,则程序格式错误。
和 12.6.2/8:
在非委托构造函数中,如果给定的非静态数据成员或基类不是由 mem-initializer-id 指定的(包括由于构造函数没有 ctor-initializer 而没有 mem-initializer-list 的情况)并且实体不是抽象类(10.4)的虚拟基类,则
— 如果实体是具有大括号或等号初始化器的非静态数据成员,则实体按照 8.5 中的规定进行初始化;
您收到的是警告而不是错误,但您可能正在使用-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