C++语法歧义

C++ syntax ambiguity

本文关键字:歧义 语法 C++      更新时间:2023-10-16

考虑:

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的默认参数表达式中。