zoukankan      html  css  js  c++  java
  • 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.

    顺序 选择 循环 总结

  • 相关阅读:
    11.菜单(一)
    线性表之顺序存储详解
    SVN 撤回已提交的代码
    线性表1
    顶层父类
    异常类之派生类
    new和delete重载
    异常类之基类
    Qt中多线程问题
    智能指针实例
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12241992.html
Copyright © 2011-2022 走看看