2013-07-09 57 views
1

basic_string類具有聲明爲靜態常量的npos。 爲什麼它聲明爲靜態常量,因爲C++ 11,爲什麼不能簡單:C++中的std :: basic_string :: npos聲明11

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

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

???

這是好的,靜態const或枚舉?

+8

爲什麼**你認爲枚舉更好? –

+0

因爲,static const變量也需要定義,不僅僅是聲明。 請參閱basic_string源文件,必須使用以下代碼: 模板< ..... > const basic_string < ... > :: size_type basic_string <.....> :: npos; – Khurshid

+1

如果它是'enum',則不能使用'npos'的地址。這可能會破壞一些舊地址的代碼;這可能是爲什麼它沒有定義爲'enum'。 – Nawaz

回答

2

有一個很好的理由不這樣做,枚舉創建一個新的類型,當解析重載或實例化模板時至少會導致更改。

這就是說,我相信你可以在類定義中實際聲明和定義類靜態常量,或者當類是模板時,是否存在該規則的一些例外情況?

+0

關於模板的好處。我不認爲它特別有用,但如果'std :: string :: npos'是一個枚舉,'std :: min(someString.size(),std :: string :: npos)將無法編譯。 –

0

這兩種解決方案几乎相同。所謂的enum hack誕生是因爲編譯器在大多數情況下不支持類初始化。不同之處在於:您無法獲取枚舉「變量」的地址;靜態常量方法是類型安全的。現在,在C++ 11中,枚舉類的確是類型安全的(除非你堅持枚舉)。

基本上,那麼唯一的區別就是在「地址」問題上。但是,當你定義一個枚舉類時,你正在定義一個類型;當你需要的是一個常數時,你可能會發現它不好定義一個類型。

+2

只是一個黑客,但enum hack的誕生是因爲C++不允許在聲明中指定初始值設定項。允許它發佈的標準黑客正是因爲人們對enum黑客不滿(因爲它導致了錯誤的類型)。 –