C++ std::basic_string::C+中的npos声明+;11

C++ std::basic_string::C+中的npos声明+;11,c++,string,c++11,C++,String,C++11,基本的字符串类有声明为静态常量的NPO。 为什么它从C++11开始声明为静态常量,为什么不简单为: class basic_string{ ................................ enum: size_type { npos = static_cast<size_type>(-1) }; .........................> }; 类基本\u字符串{ ................................ enum

基本的字符串类有声明为静态常量的NPO。 为什么它从C++11开始声明为静态常量,为什么不简单为:

class basic_string{ 
  ................................

 enum: size_type { npos = static_cast<size_type>(-1) };
.........................>
};
类基本\u字符串{
................................
enum:size_type{npos=static_cast(-1)};
.........................>
};


静态常量或枚举哪个好?

有一个很好的理由不这样做,枚举创建一个新类型,它至少会在解析重载或实例化模板时引起更改


也就是说,我相信您实际上可以在类定义中声明和定义类静态常量,或者当类是模板时,该规则是否有一些例外?

这两种解决方案几乎相同。所谓的枚举黑客之所以诞生,主要是因为编译器不支持类内初始化。区别在于:不能获取枚举“变量”的地址;静态常量方法是类型安全的。现在,在C++11中,枚举类确实是类型安全的(除非您坚持使用枚举)


因此,基本上,唯一的区别在于“地址”问题。但是,当您定义一个枚举类时,您是在定义一个类型;当您需要的是一个常量时,您可能会发现定义类型看起来很糟糕。

为什么您认为枚举更好?因为静态常量变量也需要定义,而不仅仅是声明。请参阅,基本字符串源代码,必须是以下代码:模板<…>常量基本字符串<…>::大小\类型基本\字符串::npos;如果
enum
,则不能获取
npo的地址。这可能会破坏地址所在的旧代码;这可能就是为什么它没有定义为
enum
.0.00001%code:))的原因,但很可能是这种情况。@Khurshid:我找不到任何理由来更改它。如果没有理由更改某些内容,那么就不能更改。模板的优点很好。我不能认为它特别有用,但是<>代码:STM:(String,sisid),STD::String::NPOS)<代码>编译失败,如果<代码> STD::String::NPOS是枚举。只是NIT,但是EnUM HACK是因为C++不允许在声明中指定初始化器而诞生的。允许它的标准hack的发明正是因为人们对enum hack不满意(因为它导致了错误的类型)。