「C++11」の版間の差分
行6: | 行6: | ||
== 概要 == | == 概要 == | ||
− | |||
[[C++11]]の拡張やライブラリを使用するためには、新しいコンパイラが必要になります。また、コンパイラによっては、[[C++11]]の機能を使うために、明示的にオプションで指定する必要があります。 | [[C++11]]の拡張やライブラリを使用するためには、新しいコンパイラが必要になります。また、コンパイラによっては、[[C++11]]の機能を使うために、明示的にオプションで指定する必要があります。 | ||
行22: | 行21: | ||
それぞれコンパイラのオプションについては、[[g++]]や[[clang++]]をご参照ください。 | それぞれコンパイラのオプションについては、[[g++]]や[[clang++]]をご参照ください。 | ||
− | |||
== クラスの初期化 == | == クラスの初期化 == | ||
− | |||
従来は、このようにクラスの初期化を定義できませんでした。 | 従来は、このようにクラスの初期化を定義できませんでした。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行60: | 行57: | ||
1 error generated. | 1 error generated. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
== コンテナクラスの初期化 == | == コンテナクラスの初期化 == | ||
[[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加されました。 | [[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加されました。 | ||
行90: | 行86: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
== 推論型 == | == 推論型 == | ||
+ | 変数の型を推論型にすることで、プログラミングが簡単・簡素になります。[[auto]]とRange-pased [[for]]を組み合わせることでループが簡単に書けます。 | ||
* [[auto]] | * [[auto]] | ||
* [[for]] | * [[for]] | ||
− | + | == 定数 == | |
+ | [[constexpr]]を使用することで、このような初期化も可能になりました。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | /* | ||
+ | * 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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | == nullptr == | ||
+ | [[NULL]] の定義が 0 や 0L のため、オーバーロード時の評価で期待した結果が得られない問題あり、[[nullptr]]が導入されました。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | 詳しくは、[[nullptr]]をご参照ください。 | ||
== 関連項目 == | == 関連項目 == | ||
+ | * [[constexpr]] | ||
* [[nullptr]] / std::nullptr_t | * [[nullptr]] / std::nullptr_t | ||
* [[std::initializer_list]] | * [[std::initializer_list]] | ||
行105: | 行147: | ||
* [[std::iota]] | * [[std::iota]] | ||
* [[C++14]] | * [[C++14]] | ||
− | <!-- vim: filetype=mediawiki --> | + | <!-- vim: filetype=mediawiki |
+ | --> |
2015年3月1日 (日) 19:08時点における最新版
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