C++11
C++11 とは、2011年での最新のC++言語のISO標準です。言語の機能追加や標準C++ライブラリの拡張を行っています。g++やclang++で利用できます。新しい機能を利用するためには、新しいコンパイラが必要な場合があります。
読み方
- C++11
- しーぷらすぷらす じゅういち
概要
C++11の拡張やライブラリを使用するためには、新しいコンパイラが必要になります。また、コンパイラによっては、C++11の機能を使うために、明示的にオプションで指定する必要があります。
以下は、コンパイルオプションの例です。
g++49 -std=c++11 foo.cc g++48 -std=c++11 foo.cc clang++ -std=c++11 foo.cc
FreeBSDのベースシステム以外のg++では、rpathを指定してコンパイルする必要があります。
g++49 -std=c++11 -Wl,-rpath=/usr/local/lib/gcc49/ foo.cc
それぞれコンパイラのオプションについては、g++やclang++をご参照ください。
クラスの初期化
従来は、このようにクラスの初期化を定義できませんでした。
#include <iostream> using namespace std; class C { int i; public: C (int ia) : i(ia) {} C () : C (123) {} }; int main(int argc, char const* argv[]) { C c; return 0; }
コンパイル方法は、以下の通りです。
clang++ constractor1.cpp -std=c++11
従来のコンパイラ・コンパイルモードでは、以下のエラーになります。 clang++では、C++11でのみ許可されると説明しています。
% g++ constractor1.cpp constractor1.cpp: In constructor 'C::C()': constractor1.cpp:7: error: type 'C' is not a direct base of 'C' % clang++ constractor1.cpp constractor1.cpp:7:9: error: delegating constructors are permitted only in C++11 C () : C (123) {} ^ 1 error generated.
コンテナクラスの初期化
クラスでも初期化リストを扱えるように、std::initializer_listを追加されました。 従来では、std::vectorは、初期化リストを指定できず、push_back()で初期化するなどのコーディングを必要としていました。
しかし、C++11では、こんなに簡単です。
#include <vector> using namespace std; int main(int argc, char const* argv[]) { vector<int> v = {1,2,3}; return 0; }
std::mapであれば、std::make_pairでさらに面倒なコーディングが必要でした。 しかし、C++11では、こんなに簡単です。
#include <map> #include <string> using namespace std; int main(int argc, char const* argv[]) { map<string,int> m = { {"foo",1}, {"bar",2}, }; return 0; }
推論型
変数の型を推論型にすることで、プログラミングが簡単・簡素になります。autoとRange-pased forを組み合わせることでループが簡単に書けます。
定数
constexprを使用することで、このような初期化も可能になりました。
/* * constexpr1.cpp * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <iostream> using namespace std; int main(int argc, char const* argv[]) { struct X { int n; }; constexpr X x = {123}; int a[x.n] = { 1 }; return 0; }
nullptr
NULL の定義が 0 や 0L のため、オーバーロード時の評価で期待した結果が得られない問題あり、nullptrが導入されました。
#include <iostream> using namespace std; void f(double *fptr) { cout << __PRETTY_FUNCTION__ << endl; } void f(int i) { cout << __PRETTY_FUNCTION__ << endl; } int main(int argc, char const* argv[]) { f(0); // f(int) f(nullptr); //f(double*) { char *null_ptr = NULL; char *nullptr_ptr = nullptr; if (null_ptr == nullptr_ptr) { } } return 0; }
詳しくは、nullptrをご参照ください。
関連項目
- constexpr
- nullptr / std::nullptr_t
- std::initializer_list
- clang++
- g++
- POD
- ラムダ式
- std::system_error
- std::iota
- C++14
ツイート