C ++语法歧义

时间:2011-04-06 21:41:48

标签: c++ gcc

考虑:

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中的错误吗?

1 个答案:

答案 0 :(得分:8)

这是一个已知问题。它认为第二个逗号分隔参数声明。这是因为在类定义中,函数默认参数首先仅被标记化,然后仅在读取完整的类体时才解析。因为它实际上并不真正解析默认参数,所以它不会注意到逗号实际上是模板参数列表中的逗号。

请参阅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(以确定'&lt;'是模板参数列表的一部分而不是小于运算符)。此外,病理越多

class D {
  int Foo (int i = T<1, int>::i);
  template <int A, typename B> struct T {static int i;};
};
     

很难接受。即使T在Foo之后声明,T也在Foo的默认参数表达式范围内。