C++11 右尖括号>的改进

【1】右尖括号>的改进

在C++98中,有一条需要规避的规则:

如果在实例化模板的时候出现了连续的两个右尖括号>,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。示例如下:

1 // 示例1:嵌套的模板标识
2 template <int i>  class X {};
3 template <class T> class Y {};
4 Y<X<1> > x1; // 编译成功
5 Y<X<1>> x2;  // 编译失败
6 
7 // 示例2:强制转换
8 const vector<int> v = static_cast<vector<int> >(v); // 编译成功
9 const vector<int> v = static_cast<vector<int>>(v);  // 编译失败

如此的限制,在C++11新标准中被取消了。

但是,这些“智能”的判断也会带来一些与C++98的有趣的不兼容性。

比如用户只是想让>>在模板的实例化中表示的是真正的右移,但是C++11会把它解析为模板参数界定符。示例如下:

1 template <int i> class X {}; 
2 X < 1 >> 5 > x; // 编译失败
3 X <(1 >> 5)> x; // 编译成功

使用C++98标准进行编译的话,这个例子会编译通过。

因为编译器认为X<1>>5>x;中的双尖括号是一个位移操作,那么最终可以得到一个形如X<0>x的模板实例。

如果使用C++11标准进行编译,那么程序员会得到一个编译错误的警告,因为编译器优先将双尖括号中的第一个>与X之后的<进行了配对。

虽然很少有人在模板实例化时同时进行位移操作,但是从语法上来说,C++98和C++11确实在这一点上不兼容。

要避免这样的不兼容性也很简单,使用圆括号将“1>>5”括起来(如示例中编译成功的写法),保证右移操作优先,就不会出现类似问题了。

good good study, day day up.

顺序 选择 循环 总结

原文地址:https://www.cnblogs.com/Braveliu/p/12241992.html