在此代码段中:
template<class T, int Min, int Max>
class Range
{
const T min_ = Min; // works without const
T max_ = Max;
};
我收到了错误
没有ctor的类中的非静态const成员
但如果我在课堂上初始化它,那就无关紧要了。这应该记录为错误吗?
答案 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