嵌套模板 vs 移位操作符

7
我一直在了解有关嵌套模板结束符号“>>”和移位运算符“>>”的相关信息。我已经在我的MSVS2010中尝试过,没有出现任何问题。
下面这段代码可以实现我想要的功能(对pair进行映射),但是我本来以为会出现一些关于“>>”的错误提示。
现在编译器变得更加智能了吗?
4个回答

9

请注意,之前良好的C++03代码可能会在支持此功能的编译器中出现故障。

MyArray< MyArray<int, 16 >> 2>, 5 > arrayInst;

这是修复方案:

这将是修复方法:

MyArray< MyArray<int, (16 >> 2)>, 5 > arrayInst;

1
如果一开始使用(T)而不是<T>,我们都会更好。 - shuhalo

7

4

这段代码完美地实现了我的要求(一对一映射),但我本应该会遇到一些关于 >> 的错误。

C++0x 已经解决了这个问题。所以如果你在使用 MSVS2010 时没有收到任何错误提示,那也就不足为奇了,因为 MSVS2010 实现了部分 C++0x 特性。

此外,即使是在 C++03 中,很多编译器也能够处理这种情况,虽然这并不是标准(2003)所要求的。


2
实际上,符合C++03标准的编译器不允许实现>>的C++0x语义。这种改变可能会破坏一些有效的C++03构造。 - CB Bailey
@Charles:有趣。但我想知道这个改变会破坏哪些有效的C++03构造,以及C++0x如何处理这个问题? - Nawaz
@Nawaz: 例如,在非类型模板参数的常量表达式中使用移位表达式。例如,tmpl< tmpl<2 >> 1> > instance;。通常在C++03中有效的代码,在C++0x中会变成编译错误。我还没有遇到过任何情况,导致这种情况引起行为上的静默更改。 - CB Bailey
@Charles:C++0x 如何处理这个问题?它会将 <2 >> 1> 中的 >> 解释为位移运算符吗? - Nawaz
@Charles:你是想做一个更广泛的概括吗?这是什么意思?我们在讨论哲学问题吗? :-/ - Nawaz
显示剩余4条评论

3

C++0x 现在已经支持这种语法而不会出错。许多编译器已经开始实现这些特性,因此最新的Microsoft C++编译器支持这种语法也就不足为奇了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接