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

时间:2013-07-09 12:23:53

标签: c++ string c++11

basic_string类有npos,声明为static const。 为什么它从C ++ 11开始声明为静态const,为什么不简单如下:

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

 enum: size_type { npos = static_cast<size_type>(-1) };
.........................>
};

???

哪个好,静态const或枚举?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

两种解决方案几乎相同。所谓的enum hack诞生是因为编译器主要不支持类初始化。区别在于:你不能取枚举“变量”的地址;静态const方法是类型安全的。现在,在C ++ 11中,枚举类确实是类型安全的(除了你坚持枚举)。

基本上,唯一的区别在于“地址”问题。但是,当您定义一个枚举类时,您正在定义一个类型;你可能会发现,当你需要的是一个常数时,定义一个类型是不好的。