C++语法歧义
C++ syntax ambiguity
考虑:
void f(std::pair<bool,bool> terms = std::pair<bool,bool>(1,1)) {}
gcc 4.4正常,gcc 4.3抱怨error: expected ',' or '...' before '>' token
。修复方法是:
void f(std::pair<bool,bool> terms = (std::pair<bool,bool>(1,1))) {}
原因是什么?这是4.3中的一个错误吗?
这是一个已知的问题。它认为第二个逗号分隔参数声明。这源于这样一个事实,即在类定义中,函数默认参数首先只被标记化,然后只有在读取完整的类主体时才被解析。由于它没有真正解析默认参数,因此它没有注意到逗号实际上是模板参数列表中的逗号。
请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#325阅读相关内容。引用
另一个问题是收集形成默认参数表达式的令牌。包含具有多个参数的模板id的默认参数在确定默认参数何时结束时会遇到困难。考虑一下,
template <int A, typename B> struct T { static int i;}; class C { int Foo (int i = T<1, int>::i); };
默认参数包含一个未加括号的逗号。是否要求将此逗号视为默认参数表达式的一部分,而不是另一个参数声明的开头?要将其作为默认参数的一部分接受,需要在完成C之前查找T的名称(以确定"<"是模板参数列表的一部分,而不是小于运算符(。此外,病理性更强的
class D { int Foo (int i = T<1, int>::i); template <int A, typename B> struct T {static int i;}; };
很难接受。即使T是在Foo之后声明的,T也在Foo的默认参数表达式中。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 构造对象的歧义
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 歧义语法是如何解决的
- 用前瞻性解决歧义增强::精神::气语法
- 了解'most vexing parse' - 为什么允许歧义语法?
- C++的语法歧义
- 简单代码中的c++语法歧义
- C++语法歧义