双右尖括号 (>>) 在特定情况下生成语法错误
Double closing angle brackets (>>) generate syntax error in SPECIFIC case
Eclipse(Luna,4.4.2)告诉我在以下行有语法错误:
static_cast<Vec<int, DIM>>(a.mul(b));
我记得双闭角括号>>
可能会导致某些编译器出现问题,所以我在两者之间加了一个空白:> >
。语法错误消失。
但我的程序中有许多>>
,没有检测到语法错误,例如:
Node<Element<DIM>> * e= a.get();
为什么我会在上述特定情况下出错?这不是重复错误:';varName';没有在这个范围内声明,因为我特别问为什么我的编译器有时会接受>>
,但并不总是。
您使用了c++11之前的标准编译器。旧的标准在让解析器从operator>>()
中消除嵌套模板类型说明符中使用的一对闭角括号>>
的歧义时遇到了问题。因此,你不得不在它们之间写一个空格。
像>>>
或>>*
这样的样本属于旧解析器的不同情况,因此它们在没有错误消息的情况下工作。
我必须承认,我实际上不知道在c++11(当前)标准定义中到底做了什么,这种情况可以通过符合c++11的解析器来清楚地消除歧义
"直角括号固定"见§14.2[临时名称]/p3(emphasis mine):
当解析模板参数列表时,第一个非嵌套的
>
是用作结束分隔符,而不是大于运算符。类似地,第一个非嵌套的>>
被视为两个连续但不同的>
令牌,其中第一个作为模板参数列表并完成模板id。[注意:此替换规则生成的第二个>
令牌可能会终止封闭模板id构造,或者它可能是不同构造的一部分(例如,强制转换)--尾注]
如果static_cast
在其他方面是有效的,那么OP中的两段代码在C++11中都是完全有效的,在C++03中都是完全无效的。如果您的IDE报告了一个错误,但没有报告另一个,那么这就是该IDE的错误。
我们很难(也有点毫无意义)推测错误的来源。一个潜在的原因可能是第二个>
正在关闭不同的构造(第一种情况是关闭强制转换,第二种情况是打开模板参数列表),解析器的实现不知何故错过了"第二个>
是不同构造的一部分"的情况。但这只是疯狂的猜测。
- 在特定情况下失败
- c++ 选择排序在特定情况下不起作用
- 在儿童的特定情况下,向下渗透MIN二进制堆失败
- Qt TcpSocket::readyRead 在特定情况下未触发
- C++ 在一种特定情况下替代无效*
- “overload_cast”在特定情况下失败
- 为什么在某些特定情况下具有多个线程(并行处理)会降低性能
- 在此特定情况下,使用unique_ptr的char数组
- 在特定情况下,static_cast和dynamic_cast的不同行为
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 如何在服务器端验证用户请求(在我的特定情况下)
- LeetCode210.为什么我的代码在特定情况下是错误的
- 如何仅在对象存在/特定情况下输出对象的某个部分?
- 在特定情况下,班级驱动器
- 双右尖括号 (>>) 在特定情况下生成语法错误
- ADL在特定情况下不起作用
- C++11 在特定情况下避免冗余返回类型
- 在特定情况下跳出循环
- 子进程中的Execl仅在特定情况下工作
- 为什么boost asio async_read_some在特定情况下不调用回调