「C++11」の版間の差分
提供: C++入門
行51: | 行51: | ||
^ | ^ | ||
1 error generated. | 1 error generated. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == コンテナクラスの初期化 == | ||
+ | [[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加されました。 | ||
+ | 従来では、[[std::vector]]は、初期化リストを指定できず、push_back()で初期化するなどのコーディングを必要としていました。 | ||
+ | |||
+ | しかし、[[C++11]]では、こんなに簡単です。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <vector> | ||
+ | using namespace std; | ||
+ | int main(int argc, char const* argv[]) | ||
+ | { | ||
+ | vector<int> v = {1,2,3}; | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | [[std::map]]であれば、std::make_pairでさらに面倒なコーディングが必要でした。 | ||
+ | しかし、[[C++11]]では、こんなに簡単です。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <map> | ||
+ | #include <string> | ||
+ | using namespace std; | ||
+ | int main(int argc, char const* argv[]) | ||
+ | { | ||
+ | map<string,int> m = { | ||
+ | {"foo",1}, | ||
+ | {"bar",2}, | ||
+ | }; | ||
+ | return 0; | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
行58: | 行88: | ||
== 関連項目 == | == 関連項目 == | ||
+ | * [[std::initializer_list]] | ||
* [[clang++]] | * [[clang++]] | ||
* [[g++]] | * [[g++]] | ||
− | <!-- | + | * [[POD]] |
− | vim: filetype=mediawiki | + | * [[ラムダ式]] |
− | --> | + | <!-- vim: filetype=mediawiki --> |
2013年12月27日 (金) 18:31時点における版
C++11 とは、2011年での最新のC++言語のISO標準です。言語の機能追加や標準C++ライブラリの拡張を行っています。
読み方
- C++11
- しーぷらすぷらす じゅういち
概要
C++11の拡張やライブラリを使用するためには、新しいコンパイラが必要になります。また、コンパイラによっては、C++11の機能を使うために、明示的にオプションで指定する必要があります。
以下は、コンパイルオプションの例です。
g++48 -std=c++11 foo.cc clang -std=c++11 foo.cc
クラスの初期化
従来は、このようにクラスの初期化を定義できませんでした。
#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; }