我的实际问题如下:
在C++中,嵌套参数之间需要有一个空格,比如List< List<String> >。这样做使得编译器可以区分上述和位移位>>。但同样的事情并不适用于Java List<List<String>>是完全有效的。JVM如何区分上述位移位和>>位移位?
发布于 2012-02-27 05:40:09
不同之处在于围绕假设的>>操作符的上下文。当它是运算符时,两个操作数都需要一个表达式:
EXPR >> EXPR表达式可以是变量、文字、函数调用或所有这些元素的复杂组合。然而,在列表声明的情况下,没有涉及任何表达式,只涉及类型和id。例如:
List<List<string >> id;实际上,在新的标准中,C++编译器也能够做出改变。
发布于 2012-02-27 05:55:47
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;发布于 2012-02-27 05:37:43
在Java语言中,像<<这样的操作符不能被程序员重载。因此,与在C++中相比,<<操作符有效的位置的数量要有限得多,每当编译器在源代码中看到"<<“时,它总是可以弄清楚它的意思。
https://stackoverflow.com/questions/9457374
复制相似问题