在C ++ 11中弃用了哪些C ++习惯用法

有了新标准,就有了新的办法,许多办法比老办法好,但老办法还是不错的。 出于向后兼容性的原因,这个新标准也没有被正式弃用。 所以现在的问题是:

旧的编码方式肯定比C ++ 11风格差,我们现在可以做什么呢?

在回答这个问题时,你可以跳过诸如“使用自动变量”这样的明显的东西。


  • 最终类:C ++ 11提供了final说明符来防止类派生
  • C ++ 11 lambdas大大减少了对命名函数对象(函子)类的需求。
  • 移动构造函数:由于对右值引用的一流支持,std :: auto_ptr工作的神奇方式不再需要。
  • 安全布尔:这是前面提到的。 C ++ 11的显式运算符避免了这种非常常见的C ++ 03习惯用法。
  • 缩小拟合:许多C ++ 11 STL包含提供的shrink_to_fit()成员函数,该函数应该消除临时需要的交换。
  • 临时基类:一些旧的C ++库使用这个相当复杂的习惯用法。 移动语义不再需要。
  • 类型安全枚举枚举在C ++ 11中非常安全。
  • 禁止堆分配:“= delete”语法是一种更直接的方式,表示某个特定功能被明确拒绝。 这适用于防止堆分配(即,=删除成员操作员新),防止副本,分配等。
  • 模板化typedef:C ++ 11中的别名模板减少了对简单模板类型定义的需求。 但是,复杂类型的生成器仍然需要元函数。
  • 一些数值编译时计算,如斐波纳契可以使用广义常量表达式轻松替换
  • result_of:类模板result_of的使用应该用decltype来替换。 我认为result_of在可用时使用decltype。
  • 类内成员初始值设定项可保存输入,以便使用默认值为非静态成员进行默认初始化。
  • 在新的C ++ 11代码中,应该将NULL重新定义为nullptr,但请参阅STL的讲座以了解为什么他们决定反对它。
  • 表达式模板狂热分子很高兴在C ++ 11中使用尾随返回类型函数语法。 没有更多的30行返回类型!
  • 我想我会在那里停下来!


    在一个时间点有人认为,应该通过返回const的值,而不是仅仅通过值:

    const A foo();
    ^^^^^
    

    这在C ++ 98/03中几乎是无害的,甚至可能发现了一些看起来像这样的bug:

    foo() = a;
    

    但是通过const返回在C ++ 11中是禁忌的,因为它禁止移动语义:

    A a = foo();  // foo will copy into a instead of move into it
    

    所以只需放松一下并编码:

    A foo();  // return by non-const value
    

    只要您可以放弃0NULL来支持nullptr ,那就做!

    在非泛型代码中,使用0NULL不是什么大问题。 但是一旦开始在泛型代码中传递空指针常量时,情况会迅速发生变化。 当你将0传递给一个template<class T> func(T) T被推导为一个int而不是一个空指针常量。 之后它不能被转换回空指针常量。 如果宇宙只使用nullptr ,这就陷入了根本不存在的问题的泥潭。

    C ++ 11不会将0NULL作为空指针常量使用。 但是你应该像编码一样编码。

    链接地址: http://www.djcxy.com/p/40475.html

    上一篇: what C++ idioms are deprecated in C++11

    下一篇: What does "dereferencing" a pointer mean?