2013-01-03 46 views
2

下面的代碼編譯我的版本VC9的():結構參考操作符對類名VC9

wstring test2; 
if (test2.find(L'c') == wstring.npos) 
{ 
} 

但本身

wstring.npos; 

沒有。 (wstring::npos;工作正常)在我看來,這是100%錯誤。起初我還以爲可能正在構建一個wstring,並且npos成員正在被訪問ala wstring().npos,但是很快嘗試着進入其他地方。用我自己的一類結果模擬這種情況

警告C4832:token'。'在UDT'Foo'後是非法的

但仍然編譯。

只是爲了我的理智 - 這種語法不應該工作,對吧?並且鑑於它確實有效,爲什麼表達式wstring.npos;會失敗?

+4

你確定它是'wstring.npos'編譯而不是'test2.npos'嗎? – chris

+0

我相信,只是非常驚訝! – Rollie

+2

然後它是非標準的行爲,說實話,這是預期的MSVC。 – chris

回答

4

wstring.npos應該的工作,因爲nposstatic成員,它可以與類名的範圍解析運算符(wstring::npos)或通過類實例用點操作(wstring str; str.npos;)進行訪問。

+0

關於爲什麼'wstring.npos;'表達式不能在上下文中編譯的想法?我的猜測是,當VC9知道某個特定的令牌將是一個右值時,它的解析規則有點過於寬鬆,而'wstring.npos;'正在作爲變量聲明處理鍵入帶有不正確語法的wstring。我發佈的目標更多的是從技術上理解爲什麼會發生這種情況,而不僅僅是「這個標準是否合規」,儘管我不知道我可能會得到比已經提供的答案更多的答案。 – Rollie

+0

@Rollie「關於wstring.npos表達式爲什麼不在上下文中進行編譯的任何想法?」......它不編譯,因爲它無效。我剛剛說過。 –

+0

「在上下文中」的含義:這種表達有什麼不同,使得它無法編譯,vs'if(find(...)== wstring.npos)' – Rollie

0

因爲npos是類的靜態成員。

1

然後,它的不規範行爲,其中,說實話,是可以預料的MSVC

我有時會困惑,爲什麼有假設,即MS是不檢查要求的有效性有罪。

wstring.npos不編譯和VS 2008以及2010標誌着一個錯誤。

爲什麼不編譯,在之前的文章中解釋正確。

+0

沒有跳上反MS行列,並且真正抽出時間來驗證問題。但它確實* *在我的VC9版本上編譯:http://i.imgur.com/8e9vk.jpg 如果它不在您的編譯上,我會有興趣知道我們之間的差異版本! – Rollie