「C++11」の版間の差分

提供: C++入門
移動: 案内検索
 
(同じ利用者による、間の5版が非表示)
行1: 行1:
[[C++11]] とは、2011年での最新の[[C++]]言語のISO標準です。言語の機能追加や標準[[C++ライブラリ]]の拡張を行っています。
+
[[C++11]] とは、2011年での最新の[[C++]]言語のISO標準です。言語の機能追加や標準[[C++ライブラリ]]の拡張を行っています。[[g++]]や[[clang++]]で利用できます。新しい機能を利用するためには、新しいコンパイラが必要な場合があります。
  
 
'''読み方'''
 
'''読み方'''
行6: 行6:
  
 
== 概要 ==
 
== 概要 ==
 
 
[[C++11]]の拡張やライブラリを使用するためには、新しいコンパイラが必要になります。また、コンパイラによっては、[[C++11]]の機能を使うために、明示的にオプションで指定する必要があります。
 
[[C++11]]の拡張やライブラリを使用するためには、新しいコンパイラが必要になります。また、コンパイラによっては、[[C++11]]の機能を使うために、明示的にオプションで指定する必要があります。
  
 
以下は、コンパイルオプションの例です。
 
以下は、コンパイルオプションの例です。
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 +
g++49 -std=c++11 foo.cc
 
g++48 -std=c++11 foo.cc
 
g++48 -std=c++11 foo.cc
clang -std=c++11 foo.cc
+
clang++ -std=c++11 foo.cc
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== クラスの初期化 ==
+
FreeBSDのベースシステム以外の[[g++]]では、rpathを指定してコンパイルする必要があります。
 +
<syntaxhighlight lang="bash">
 +
g++49 -std=c++11 -Wl,-rpath=/usr/local/lib/gcc49/ foo.cc
 +
</syntaxhighlight>
  
 +
それぞれコンパイラのオプションについては、[[g++]]や[[clang++]]をご参照ください。
 +
== クラスの初期化 ==
 
従来は、このようにクラスの初期化を定義できませんでした。
 
従来は、このようにクラスの初期化を定義できませんでした。
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
行52: 行57:
 
1 error generated.
 
1 error generated.
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== コンテナクラスの初期化 ==
 
== コンテナクラスの初期化 ==
 
[[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加されました。
 
[[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加されました。
行82: 行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
 
* [[std::initializer_list]]
 
* [[std::initializer_list]]
 
* [[clang++]]
 
* [[clang++]]
行94: 行145:
 
* [[ラムダ式]]
 
* [[ラムダ式]]
 
* [[std::system_error]]
 
* [[std::system_error]]
<!-- vim: filetype=mediawiki -->
+
* [[std::iota]]
 +
* [[C++14]]
 +
<!-- 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をご参照ください。

関連項目