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++中的要有限得多,编译器在源代码中看到"<<"时总能弄清楚它的意思。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时