C++语法歧义

Any*_*orn 6 c++ gcc

考虑:

void f(std::pair<bool,bool> terms = std::pair<bool,bool>(1,1)) {}
Run Code Online (Sandbox Code Playgroud)

gcc 4.4没关系,gcc 4.3抱怨error: expected ',' or '...' before '>' token.修复是:

void f(std::pair<bool,bool> terms = (std::pair<bool,bool>(1,1))) {}
Run Code Online (Sandbox Code Playgroud)

什么原因?这是4.3中的错误吗?

Joh*_*itb 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);
};
Run Code Online (Sandbox Code Playgroud)

默认参数包含非括号内的逗号.是否需要将此逗号视为默认参数表达式的一部分而不是另一个参数声明的开头?要接受此作为默认参数的一部分,需要在C完成之前查找T(以确定'<'是模板参数列表的一部分而不是小于运算符).而且,病理性越强

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

很难接受.即使T在Foo之后声明,T也在Foo的默认参数表达式中.

  • c ++很难:O (4认同)