0. 摘要

  近期读了一些关于C++11标准的材料。 本篇博客将从新标准的优点、与旧版本的区别和使用方法三个角度,大致介绍我对C++11的认识。

C++11标准,原名C++0x, 是03版旧标准的更新。总结来说,新标准给我更加接近脚本语言的感觉。move语义的支持、auto关键字自动类型等新特性,使得C++11在性能和效率上比旧版本有更大优势。

  我参考的博客和网页有:

  http://www.csdn.net/article/2012-05-15/2805585

  http://stackoverflow.com/questions/1930903/bind-vs-lambda

  http://baike.baidu.com/link?url=IsEuVplXgGEw6H_tjyGU2pKIKffDw8Sry0aZd9btV8O5upyzGRofxXDviB9RI5C-XYpNY7tzAD9KAZLW8fW4n_

  http://blog.csdn.net/lancelet/article/details/7220558

  http://zh.wikipedia.org/wiki/C++0x

  http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

  http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx

  http://herbsutter.com/elements-of-modern-c-style/

  http://en.wikipedia.org/wiki/C%2B%2B11

1. C++11 新特性概述

  下面简要介绍对我来说意义较为明显的几点

  1. 右值引用和move语义(move semantics)。它是优化复制的一种方式。在很多时候,深度复制是低效率的行为,而move语义将允许简单的复制指针到字符缓冲区,减少在内存配置上使用的时间。获取右值必须使用std::move<T>().举例:

 bool is_r_value(int &&) { return true; }
bool is_r_value(const int &) { return false; } void test(int && i)
{
is_r_value(i); // i 為具名變數,即使被宣告成右值也不會被認定是右值。
is_r_value(std::move<int&>(i)); // 使用 std::move<T>() 取得右值。
}

  2. 类型推导:auto关键字。auto关键字可以使得我们再也不必根据右值复杂的表达式推断左值的类型。它的意义在于大大增加了代码可读性,并且节省了很多无意义的开发时间,而将数据类型的推测交给编译器来做。

  举例而言,原本我们这样的表达:

 for(vector<int>::const_iterator itr = myvec.begin(); itr != myvec.end();++itr)

  可以简化为:

 for(auto itr = myvec.begin(); itr != myvec.end();++itr)

  decltype可以得到参数实例的数据类型,与auto弥补:

 #include <vector>

 int main()
{
const std::vector<int> v();
auto a = v[];// a 为 int 类型
decltype(v[]) b =; // b 为 const int& 类型,即std::vector<int>::operator[](size_type)const 的返回类型
auto c =; // c 为 int 类型
auto d = c; // d 为 int 类型
decltype(c) e; // e 为 int 类型,c 实体的类型
decltype((c)) f = e; // f 为 int& 类型,因为(c)是左值
decltype() g; // g为int类型,因为0是右值
return ;
}

  3. smart pointer智能指针。智能指针改善了auto_ptr的问题,使得开发过程不必担心内存释放的问题,处理内存泄露的过程得以简化。

  4. 以范围为基础的for循环。for 语句将允许简单的范围迭代:第一部分定义被用来做范围迭代的变量,就像被声明在一般for循环的变量一样,其作用域仅只于循环的范围。而在":"之后的第二区块,代表将被迭代的范围。这样一来,就有了能够允许C-style数组被转换成范围概念的概念图。这可以是std::vector,或是其他符合范围概念的对象。举例:

  原本的表达:

 // circle and shape are user-defined types
circle* p = new circle( );
vector<shape*> v = load_shapes(); for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {
if( *i && **i == *p )
cout << **i << “ is a match\n”;
} for( vector<circle*>::iterator i = v.begin();
i != v.end(); ++i ) {
delete *i; // not exception safe
} delete p;

  使用新标准,表达相同的过程,可以大大简化:

 #include <memory>
#include <vector>
// ...
// circle and shape are user-defined types
auto p = make_shared<circle>( );
vector<shared_ptr<shape>> v = load_shapes(); for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) {
if( s && *s == *p )
cout << *s << " is a match\n";
} );

  5. lambda表达式。lambda表达式允许如下定义:

 [](int x, int y) { return x + y; }

  lambda表达式解决了函数内部不得不使用function对象造成的繁琐问题。

  6. 空指针的调整。在标准C中,0值兼顾了数值和NULL的双重语义,C++并未继承此规则,不允许将void*隐式转换为其他类型的指针。char*c = NULL;这样的表达无法直观的实现。C++11使用nullptr将0和空指针分离开:

 char* pc = nullptr;     // OK
int * pi = nullptr; // OK
int i = nullptr; // error foo(nullptr); // 呼叫 foo(char *)

  7. C++还有其他很有意义的改进,但因笔者目前接触不到这些改进的意义,仅作简单的列举:

  7.1 显示虚函数重载

  7.2 对POD定义的修正

  7.3 强类型的枚举

  7.4 模板别名

  7.5 变长参数模板

  7.6 正则表达式

3. 总结

  C++11,相比于旧版本,主要的提升方面为:1. 语言运行时的表现强化(就是效率更高了) 2. 核心语言使用性加强(就是能写出更简洁的代码) 3. 核心语言能力提升(允许更多的如变长参数模板的表达)

4. 我的问题

  lambda表达式不是很透彻..

  虚函数重载不知道什么时候用?

  其实,我的问题都应该会在新版本的C++Premer中得到解答,这里的疑问只有,在团队编程中,C++11如何与C++03兼容?如果一个项目里面其他的人都使用C++03,或者一个已经写好的程序使用的是C++03,如果做出C++11的改动,能否可行,或者会不会造成问题?

3. 怎么使用?(编译器支持)

  新版本的C++经典教程已经对新标准进行了更新,目前主流编译器对C++11 的支持如下

C++11 Core Language Features

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Rvalue references v0.1, v1.0, v2.0, v2.1, v3.0

v2.0

v2.1*

v2.1*

ref-qualifiers

No

No

No

Non-static data member initializers

No

No

Yes

Variadic templates v0.9, v1.0

No

No

Yes

Initializer lists

No

No

Yes

static_assert

Yes

Yes

Yes

auto v0.9, v1.0

v1.0

v1.0

v1.0

Trailing return types

Yes

Yes

Yes

Lambdas v0.9, v1.0, v1.1

v1.0

v1.1

v1.1

decltype v1.0, v1.1

v1.0

v1.1**

v1.1

Right angle brackets

Yes

Yes

Yes

Default template arguments for function templates

No

No

Yes

Expression SFINAE

No

No

No

Alias templates

No

No

Yes

Extern templates

Yes

Yes

Yes

nullptr

Yes

Yes

Yes

Strongly typed enums

Partial

Yes

Yes

Forward declared enums

No

Yes

Yes

Attributes

No

No

No

constexpr

No

No

No

Alignment

TR1

Partial

Partial

Delegating constructors

No

No

Yes

Inheriting constructors

No

No

No

Explicit conversion operators

No

No

Yes

char16_t/char32_t

No

No

No

Unicode string literals

No

No

No

Raw string literals

No

No

Yes

Universal character names in literals

No

No

No

User-defined literals

No

No

No

Standard-layout and trivial types

No

Yes

Yes

Defaulted and deleted functions

No

No

Yes*

Extended friend declarations

Yes

Yes

Yes

Extended sizeof

No

No

No

Inline namespaces

No

No

No

Unrestricted unions

No

No

No

Local and unnamed types as template arguments

Yes

Yes

Yes

Range-based for-loop

No

Yes

Yes

override and final v0.8, v0.9, v1.0

Partial

Yes

Yes

Minimal GC support

Yes

Yes

Yes

noexcept

No

No

No

C++11 Core Language Features: Concurrency

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Reworded sequence points

N/A

N/A

N/A

Atomics

No

Yes

Yes

Strong compare and exchange

No

Yes

Yes

Bidirectional fences

No

Yes

Yes

Memory model

N/A

N/A

N/A

Data-dependency ordering

No

Yes

Yes

Data-dependency ordering: function annotation

No

No

No

exception_ptr

Yes

Yes

Yes

quick_exit

No

No

No

Atomics in signal handlers

No

No

No

Thread-local storage

Partial

Partial

Partial

Magic statics

No

No

No

C++11 Core Language Features: C99

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

__func__

Partial

Partial

Partial

C99 preprocessor

Partial

Partial

Partial

long long

Yes

Yes

Yes

Extended integer types

N/A

N/A

N/A

C++11 能好怎?的更多相关文章

  1. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  2. WinForm 天猫2013双11自动抢红包【源码下载】

    1. 正确获取红包流程 2. 软件介绍 2.1 效果图: 2.2 功能介绍 2.2.1 账号登录 页面开始时,会载入这个网站:https://login.taobao.com/member/login ...

  3. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  4. CSS垂直居中的11种实现方式

    今天是邓呆呆球衣退役的日子,在这个颇具纪念意义的日子里我写下自己的第一篇博客,还望前辈们多多提携,多多指教! 接下来,就进入正文,来说说关于垂直居中的事.(以下这11种垂直居中的实现方式均为笔者在日常 ...

  5. C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  6. CSharpGL(11)用C#直接编写GLSL程序

    CSharpGL(11)用C#直接编写GLSL程序 +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharp ...

  7. ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...

  8. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  9. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  10. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①

    系列目录 系统需要越来越自动化,我们需要引入日志记录和异常捕获管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的.系统的异常需要被捕获,而不是将系统出错显示 ...

随机推荐

  1. c# 使用 静态类+xml序列化 保存配置文件

    namespace TVCorrectionDataProcess{    [XmlRoot(ElementName = "Config")]    public class Co ...

  2. Support Library官方教程(1)概述

    Support Library The Android Support Library package is a set of code libraries that provide backward ...

  3. svn: E180001: Unable to open an ra_local session to URL问题解决方案

    在使用Android Studio的SVN导入项目时,出现了: svn: E180001: Unable to open an ra_local session to URLsvn: E180001: ...

  4. Qt之进程间通信(共享内存)

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  5. 终极解决方案:windows10开机黑屏,死机

    windows10开机黑屏,死机一般情况都是由于双显卡中的独立显卡驱动造成的! 那么试着升级一下你的BIOS吧!一定要在官网下载你对应的BIOS驱动,然后双击安装,这个时候就别再动机子了,让他自己刷新 ...

  6. Lambda表达式【转】

    lambda表达式是对匿名方法的一种改进,具有更加简洁的语法和更易理解的形式,lambda表达式可以包括表达式和语句,并且可以用与创建委托或表达式目录树类型. lambda表达式都使用Lambda运算 ...

  7. 出现错误ActivityManager: Warning: Activity not started, its current task has been

    1.在学习两个Activity的切换时,重新把新的工程部署上模拟器时候出现错误:ActivityManager: Warning: Activity not started, its current ...

  8. Java [Leetcode 203]Remove Linked List Elements

    题目描述: Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...

  9. Linux Shell 脚本

    1. 写一个脚本,利用循环计算10的阶乘#!/bin/shfactorial=1for a in `seq 1 10`do       factorial=`expr $factorial \* $a ...

  10. 服务器安装Apache+Tomcat+Memcached共享Session的构架设计

    网站集群部署解决计划 一.       计划目标 实现互动留言系统.后台发布系统的高可用性,有效解决高并发量对单台应用服务器的打击,确保应用服务器单点故障不影响系统正常运行. 二.       部署架 ...