簡體   English   中英

C ++中的模板,Java中的泛型和>>位移運算符

[英]Templates in C++, Generics in Java and the >> bit shift operator

我的實際問題如下:

在C ++中,嵌套參數需要在其間有空格,如List< List<String> > 這樣做是為了使編譯器可以區分上述和位移>> 但是同樣的事情對於Java List<List<String>>是完全有效的。 JVM如何區分上述和>>位移?

不同之處在於圍繞假定的>>運算符的上下文。 當它是一個運算符時,兩個操作數都需要一個表達式:

EXPR >> EXPR

表達式可以是變量,文字,函數調用或所有這些元素的復雜組合。 但是,在列表聲明的情況下,不涉及表達式,只有類型和id。 例如:

List<List<string >> id;

實際上,在新標准中,C ++編譯器也能夠發揮作用。

C ++中的直接問題是模板參數實際上可能包含表達式:常量表達式是完全有效的模板參數。 我不認為在Java中這是真的。 這是一個表達式會搞砸的例子:

std::list<std::bitset<32 >> 2> > list_of_bitset8s;

也就是說,最初的規則主要是為了保留現有的C ++解析器,這些解析器傾向於使用相對簡單的詞法分析,這種分析基本上建立在無上下文的正則表達式之上。 此外,當添加模板時,沒有人真正預料到嵌套模板會被大量使用。 事實證明它們是和C ++ 2011通過允許使用關閉尖括號而不干預空間合法來解決問題。 為了消除使用右移位運算符的表達式用作模板的罕見情況,必須使用參數括號,即上述聲明對於C ++ 2003是合法的,並且對於C ++ 2011是非法的。 它必須被替換

std::list<std::bitset<(32 >> 2)>> list_of_bitset8s;

(如果需要,關閉尖括號可以繼續使用空格)。

當然,這是一個不完整的修復,因為以下仍然是非法的:

::std::list<::std::bitset<8>> list of bitset8s;

在Java中,像<<這樣的運算符不能被程序員重載。 因此, <<運算符有效的地方數量比C ++中的數量要多得多,編譯器總能找出源代碼中看到“<<”的含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM