2011-06-04 26 views
24

>>>作爲>> >作了簡化。但如果第一個>關閉模板參數列表,結果應該等於> > >還是> >>,會發生什麼?如何在C++ 0x中使用`>>>`lexed?

這非常重要下面的代碼:

template<class T> struct X { }; 

void operator >>(const X<int>&, int) { } 

int main() { 
    *new X<int>>> 1; 
} 
+0

很好的問題.. +很多:) – cwap 2011-06-04 09:35:10

+0

我認爲這取決於語言的版本,我認爲C++ 0x lexes >>>不同於舊版本。 – 2011-06-04 10:15:21

+0

''模板參數是語言定義中所犯的許多錯誤之一。 – 6502 2011-06-04 10:31:41

回答

10

的FDIS的文中說

同樣,第一非嵌套>>被視爲兩個連續但不同的>令牌

它不能解開令牌和relex。所以這將是一個> > >。請注意,C++實現的輸入首先被解壓縮爲預處理令牌,然後這些令牌被轉換爲C++令牌。因此,首先您的輸入是C++令牌>> >,然後C++解析器將它們更改爲> > >

將每個預處理標記轉換爲標記。 (2.7)。所產生的令牌在語法和語義上被分析並翻譯爲翻譯單元。 [注意:分析和翻譯令牌的過程有時可能會導致一個令牌被一系列其他令牌替代(14.2)。 - 尾註]

你沒有機會合並那兩個尾隨> >令牌。

1

在這種特定的代碼,我的理解是,這將是> >>。解析器很貪婪,並會嘗試儘可能多地綁定到每個單個令牌中,當遇到第一個令牌時,上下文規則將規定它是一個完整令牌,並且它不應該試圖解析更多,但一旦它模板參數上下文之外它將解析以下的一般規律的休息,就好像它是X<int> >>,或

typedef X<int> X_int; 
X_int >> 1; 
+1

你在這裏混合瞭解析器和詞法分析器。解析器不會將任何東西捆綁到標記。 – ybungalobill 2011-06-04 09:51:28

+0

@ybungalobill:你過於迂腐,它是一個不需要的環境。但是在這裏,詞法分析器(如果lr1)無法幫助確定第一個'>'是模板的一部分。所以術語解析器是有效的。 – 2011-06-04 10:09:53

+0

@Martin:感謝您的編輯 – 2011-06-04 10:20:14

相關問題