繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM