首页 » C/C++ » C++11

C++11引入的新变化

以下笔记主要来自Bjarne Stroustrup的C++11 FAQ

重启auto关键字,用于自动推导数据类型:

auto x = 7;     // int

template<typename T>
void print(const vector<T>& v) {
    for(auto p = v.begin(); p != v.end(); ++p) {    // typename vector<T>::const_iterator p = v.begin();
        std::cout << *p << "\n";
    }
}

for循环的新遍历方式(类似foreach):

vector<int> v = {1, 2, 3, 4, 5, 6};
for(auto x : v) std::cout << x << "\n";
for(auto& x : v) ++x;    // reference
for(const auto x : {1,2,3,4,5,6}) std::cout << x << "\n";

右尖括号的问题不复存在(Bjarne的心腹大患):

vector<vector<string>> vvs;

enum类(enum class或new enums或strong enums),它的形式如下:

enum class Color { red, blue };         // by default, the underlying type is int
enum class Color : char { red, blue };  // compact representation
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U; }

// 支持前置声明
enum class Color : char;    // (forward) declaration
void foobar(Color* p);
// ... 
enum class Color : char { red, blue };  // definition

std::bind()和std::function()包含在<functional>中。

std::bind()的使用:

int f(int, char, double);
auto f1 = bind(f, _1, 'c', 1.2);
int x = f1(7);

auto f2 = bind(f, _3, _2, _1);  // reverse argument order
int x = f2(1.2, 'c', 7);

对重载函数使用bind时,如果不能推断bind的具体函数,则有编译错误。

类成员变量的初始化(In-class memeber initializers)

C++98中只有static const int类型的变量可以直接在声明时初始化:

class X {
    static const int x = 7;
};

C++11中取消了这个限制,并极大程度的简化了构造函数的写法:

class X {
public:
    A() {}
    A(int a) : _a(a) {}     /* overrides default  */
    int _a = 7;
    int _b = 5;
private:
    HashingFunction hash_aglo{"MD5"};   
    std::string _s{"constructor"};
};

用default和delete修饰类成员函数

禁止复制(prohibiting copying):

class X {
    X& operator(const X&) = delete;
    X(const X&) = delete;
};

让编译器生成默认的构造函数:

class Y {
    Y& operator=(const Y&) = default;
    Y(const Y&) = default;
};

atomic

原子操作:

#include <atomic>

std::atomic_flag是一个原子型bool类型,保证是无锁(lock-free)实现。与std::atomic<bool>的区别是std::atomic_flag没有load和store操作。

memory_order的定义:

#include <atomic>

enum memory_order {
    memory_order_relaxed,
    memory_order_consume,
    memory_order_acquire,
    memory_order_release,
    memory_order_acq_rel,
    memory_order_seq_cst,
};

C++11编译器支持情况

GCC 4.3之后的版本可以添加编译参数:-std=c++0x(或-std=gnu++0x),GCC 4.7之后的版本可以添加编译参数:-std=c++11(或-std=gnu++11)。

从 ftp://ftp.gnu.org/gnu/gcc/gcc-4.7.2/ 下载GCC。解压后编译:

$ ./configure --prefix=/home/bailing/tools/gcc --enable-languages=c,c++
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.

分别下载依赖的软件包:

$ wget ftp://ftp.gnu.org/gnu/gmp/gmp-5.0.5.tar.bz2
$ tar -xjf gmp-5.0.5.tar.bz2 && cd gmp-5.0.5
$ ./configure --prefix=/home/bailing/tools/gmp-5.0.5
$ make && make install

$ wget http://mpfr.loria.fr/mpfr-current/mpfr-3.1.1.tar.bz2
$ tar -xjf mpfr-3.1.1.tar.bz2 && cd mpfr-3.1.1
$ ./configure --prefix=/home/bailing/tools/mpfr-3.1.1
$ make && make install

$ wget http://www.multiprecision.org/mpc/download/mpc-1.0.1.tar.gz
$ sha1sum mpc-1.0.1.tar.gz 
8c7e19ad0dd9b3b5cc652273403423d6cf0c5edf  mpc-1.0.1.tar.gz
$ tar -xzf mpc-1.0.1.tar.gz && cd mpc-1.0.1
$ ./configure --with-gmp=/home/bailing/tools/gmp-5.0.5/ --with-mpfr=/home/bailing/tools/mpfr-3.1.1/ --prefix=/home/bailing/tools/mpc-1.0.1
$ make && make install

编译GCC:

$ ./configure --prefix=/home/bailing/tools/gcc --enable-languages=c,c++ --with-gmp=/home/bailing/tools/gmp-5.0.5/ --with-mpfr=/home/bailing/tools/mpfr-3.1.1/ --with-mpc=/home/bailing/tools/mpc-1.0.1/

再次出现错误:configure: error: cannot compute suffix of object files: cannot compile。查看日志发现错误记录:

conftest.c:10:19: error: ppl_c.h: No such file or directory
conftest.c:16: error: 'choke' undeclared (first use in this function)
conftest.c:16: error: (Each undeclared identifier is reported only once
conftest.c:16: error: for each function it appears in.)
conftest.c:16: error: expected ';' before 'me'

看起来还缺少一些库:

// install ppl
$ wget ftp://ftp.cs.unipr.it/pub/ppl/releases/1.0/ppl-1.0.tar.bz2
$ tar -xjf ppl-1.0.tar.bz2 && cd pp1-1.0
$ ./configure --prefix=/home/bailing/tools/ppl-1.0
$ make && make install

// install isl
$ wget ftp://ftp.linux.student.kuleuven.be/pub/people/skimo/isl/isl-0.10.tar.bz2
$ tar -xjf isl-0.10.tar.bz2 && cd isl-0.10
$ ./configure --prefix=/home/bailing/tools/isl-0.10
$ make && make install

// install CLooG
$ wget http://www.bastoul.net/cloog/pages/download/cloog-0.17.0.tar.gz
$ tar -xzf cloog-0.17.0.tar.gz && cd cloog-0.17.0

GMP - GNU Multiple Precision Arithmetic Library。

CLooG基于isl的版本需要GMP库。

参考

GCC for C++11

OWent - Linux编译安装GCC 4.7

分享

0