我和朋友正在讨论C++模板.他问我应该做什么:
#includetemplate struct A { A(bool) { std::cout << "bool\n"; } A(void*) { std::cout << "void*\n"; } }; int main() { A *d = 0; const int b = 2; const int c = 1; new A< b > (c) > (d); }
main中的最后一行有两个合理的解析.'b'是模板参数还是b > (c)
模板参数?
虽然编译这个很简单,看看我们得到了什么,但我们想知道是什么解决了歧义?
AFAIK它将被编译为new A(c) > d
.这是解析它的唯一合理方法恕我直言.如果解析器在正常情况下无法假设>结束模板参数,那将导致更加模糊.如果你想要另一种方式,你应该写:
new A<(b > c)>(d);
正如Leon&Lee所述,14.2/3(C++ '03)明确定义了这种行为.
C++'0x增加了类似规则适用的乐趣>>
.基本概念是,在解析模板参数列表时,非嵌套>>
将被视为两个不同的>
>
标记而不是右移运算符:
templatestruct A { A(bool); A(void*); }; template class C { public: C (int); }; int main() { A *d = 0; const int b = 2; const int c = 1; new C > (c) > (d); // #1 new C > (c) > (d); // #2 }
"#1"和"#2"在上面等同.
这当然解决了必须在嵌套特化中添加空格的烦恼:
C> c; // Parse error in C++ '98, '03 due to "right shift operator"