C++ 为什么模板id在“中”;A<;0>=0“;由于大于或等于运算符“,”而不能在没有空格的情况下编译&燃气轮机=&引用;?

C++ 为什么模板id在“中”;A<;0>=0“;由于大于或等于运算符“,”而不能在没有空格的情况下编译&燃气轮机=&引用;?,c++,templates,c++11,language-lawyer,C++,Templates,C++11,Language Lawyer,-[结束示例] 138)一个,它包含动态强制转换的类型id, 静态强制转换,重新解释强制转换或常量强制转换,或包含 这个 在本说明中,后续模板id的模板参数被视为嵌套的 是我遗漏了什么还是这是一个编译器错误?这是的一个效果,词法分析器使用尽可能多的字符来形成一个有效的标记。这是由C++标准部分草案 2.5 >代码> [LeX.ppTeM]所说的: 否则,下一个预处理令牌是 可以构成预处理标记的字符,即使 会导致进一步的词汇分析失败 < >你所引用的任何一个案例都需要一个特定的例外,比如这个例子,

-[结束示例]

138)一个
,它包含
动态强制转换的类型id
静态强制转换
重新解释强制转换
常量强制转换
,或包含 这个 在本说明中,后续模板id的模板参数被视为嵌套的

是我遗漏了什么还是这是一个编译器错误?

这是的一个效果,词法分析器使用尽可能多的字符来形成一个有效的标记。这是由C++标准部分草案<代码> 2.5 >代码> [LeX.ppTeM]所说的:

否则,下一个预处理令牌是 可以构成预处理标记的字符,即使 会导致进一步的词汇分析失败

< >你所引用的任何一个案例都需要一个特定的例外,比如这个例子,对于<代码>是C++中的一个有效的标记(右移)。 这是一个小问题,但持续,恼人,并有点 令人尴尬的问题。如果费用是合理的,那么似乎是这样 值得消除的惊喜

本文档的目的是解释允许使用>>的方法 视为两个收尾尖括号,以及讨论 由此产生的问题。提出了一个具体的选项和措辞 这将执行本工作文件中的建议

还指出了
=
案例:

还值得注意的是,问题也可能发生在>>= 和>=代币。比如说

#include <vector>
typedef std::vector<std::vector<int> > Table;  // OK
typedef std::vector<std::vector<bool>> Flags;  // Error
void func(List=default_val1);
void func(列表=默认值2);
这两种形式目前都是格式错误的。这可能是可取的 也可以解决这个问题,但本文不打算这样做


注意,此更改。

由于我完全不理解的原因,在gcc 4.7.3上,编译错误是“函数的参数太少
void f(A)
”=不涉及大于运算符。它是大于或等于运算符,是不同的标记。一些使
foo
起作用的努力(参见那里的
>
)被视为
foo
,但可能不适用于
=
。我首先要弄清楚对标准的修改在哪里起作用,然后对问题进行反向工程。这不就是最大多数规则吗?这个例子需要一个特殊的异常,就像雅克说的,但是当它被解析时,编译器会将它读为>=(因为编译器是懒惰的)而且因为在用户(如您)报告之前,没有人一定会想到添加一个条件来查看>是否与<匹配的重要性,因此bug会经常发生。因此,是的,我会说这是一个bug,但其他人可能不同意。实际上,这一问题已在为
>
添加特殊修复的论文中提到。
template<int i> class X { /* ...*/ };

X< 1>2 > x1; // syntax error
X<(1>2)> x2; // OK
template<typename T> class SomeClass;
class Class;

SomeClass<::Class>* cls;
#include <vector>
typedef std::vector<std::vector<int> > Table;  // OK
typedef std::vector<std::vector<bool>> Flags;  // Error
void func(List<B>= default_val1);
void func(List<List<B>>= default_val2);