more c++11

57
C++11 is ? C++11 でできること まとめ . . More C++11 hatsusato 京都大学理学部もうすぐ 2 2013 3 21 1 / 51

Upload: -

Post on 14-Jun-2015

8.078 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: More C++11

C++11 is何?C++11でできること

まとめ

.

...... More C++11

hatsusato

京都大学理学部もうすぐ 2回

2013年 3月 21日

1 / 51

Page 2: More C++11

C++11 is何?C++11でできること

まとめ

.. 自己紹介

@hatsusatoのプロフィール

C++一筋理学部数学系志望

げんごつくる

アニメ好き作画オタク

カラオケ行きたい

2 / 51

Page 3: More C++11

C++11 is何?C++11でできること

まとめ

.. 自己紹介

@hatsusatoのプロフィール

C++一筋理学部数学系志望

げんごつくる

アニメ好き作画オタク

カラオケ行きたい

2 / 51

Page 4: More C++11

C++11 is何?C++11でできること

まとめ

.. 自己紹介

@hatsusatoのプロフィール

C++一筋理学部数学系志望

げんごつくる

アニメ好き作画オタク

カラオケ行きたい

2 / 51

Page 5: More C++11

C++11 is何?C++11でできること

まとめ

.. 目次

...1 C++11 is何?

...2 C++11でできること

...3 まとめ

3 / 51

Page 6: More C++11

C++11 is何?C++11でできること

まとめ

.. C++11 is何?

C++11とは、2011年に標準化された C++の最新規格のことである。

それまでの C++03とは比べ物にならないほどまともになった。これで一人前の言語に。

コア言語の機能が拡張され、今までに出来なかったり、面倒くさい遠回りをして実現していたたくさんのことが簡単にできるように。標準ライブラリも大きく拡充され、たくさんの便利なライブラリが簡単に利用できるように。それでいて実行時速度は変わらないか、むしろ速くなった。

要するに C++11最高。

4 / 51

Page 7: More C++11

C++11 is何?C++11でできること

まとめ

.. C++11 is何?

C++11とは、2011年に標準化された C++の最新規格のことである。それまでの C++03とは比べ物にならないほどまともになった。これで一人前の言語に。

コア言語の機能が拡張され、今までに出来なかったり、面倒くさい遠回りをして実現していたたくさんのことが簡単にできるように。標準ライブラリも大きく拡充され、たくさんの便利なライブラリが簡単に利用できるように。それでいて実行時速度は変わらないか、むしろ速くなった。

要するに C++11最高。

4 / 51

Page 8: More C++11

C++11 is何?C++11でできること

まとめ

.. C++11 is何?

C++11とは、2011年に標準化された C++の最新規格のことである。それまでの C++03とは比べ物にならないほどまともになった。これで一人前の言語に。

コア言語の機能が拡張され、今までに出来なかったり、面倒くさい遠回りをして実現していたたくさんのことが簡単にできるように。標準ライブラリも大きく拡充され、たくさんの便利なライブラリが簡単に利用できるように。それでいて実行時速度は変わらないか、むしろ速くなった。

要するに C++11最高。

4 / 51

Page 9: More C++11

C++11 is何?C++11でできること

まとめ

.. C++11でできること

...1 auto

...2 nullptr

...3 初期化リスト

...4 統一された初期化構文

...5 範囲 for

...6 右辺値参照と移動コンストラクタ

...7 メンバ関数の参照修飾

...8 decltypeと後置戻り値構文

...9 ラムダ

...10 可変長テンプレート

...11 強く型付けされた列挙型

...12 コンパイル時定数式

...13 非静的メンバの初期化

...14 関数の default・delete指定

...15 委譲コンストラクタ

...16 継承コンストラクタ

...17 static assert

...18 noexcept

...19 Unicode文字列リテラル

...20 raw文字列リテラル

...21 ユーザ定義リテラル

...22 explicit変換演算子

...23 別名テンプレート

...24 デフォルトテンプレート引数

...25 局所型や無名型の template引数渡し

...26 externテンプレート宣言

...27 拡張 sizeofと拡張 friend宣言

...28 縮小変換の禁止

...29 無制限共用体

...30 アトリビュート

...31 C99の機能

...32 その他の機能5 / 51

Page 10: More C++11

C++11 is何?C++11でできること

まとめ

.. auto

これまで autoキーワードはほとんど無意味な記憶クラス指定子だったが、この度非常に強力な機能を持って生まれ変わった。

型として初期化に用いることで、初期化式からの型推論によって得られた型に自動的に置き換えられる。

後述の戻り値を後置する関数宣言構文にも用いられる。

auto x = 42; // int x;

auto y = 0.0f; // float y;

6 / 51

Page 11: More C++11

C++11 is何?C++11でできること

まとめ

.. nullptr

これまでヌルポインタとして用いられていた NULLは整数型の 0に過ぎず、ポインタ型と整数型のオーバーロード解決などにおいて意図に反する結果となっていた。

C++11ではあらゆるポインタ型と比較代入でき、整数型に暗黙変換されない nullptrが導入された。

void foo(int) {std::cout << "int" << std::endl; }

void foo(char*) { std::cout << "char*" << std::endl; }

foo(NULL); // int

foo(nullptr ); // char*

7 / 51

Page 12: More C++11

C++11 is何?C++11でできること

まとめ

.. initializer list

Cライクな配列や構造体の初期化構文を C++でもより柔軟な形で提供する。標準ライブラリに、initializer listクラスの入った<initializer list>ヘッダが新しく加わった。標準コンテナは initializer listを引数に取るコンストラクタを持つようになったので、具体的な要素による初期化が簡単になった。後述の統一された初期化構文の重要な一端を担う。

std::vector <double > v = {0, 1, 2.71, 3.14};

std::list <std::pair <int ,int >> lpii = {{1 ,2} ,{2 ,3} ,{3 ,4}};

void f(std:: initializer_list <int >);

f({0, 12, 345, 6789});

f({});

8 / 51

Page 13: More C++11

C++11 is何?C++11でできること

まとめ

.. uniform initialization syntax and semantics

これまでの初期化構文には関数形式のコンストラクタ呼び出しや、構造体や配列の初期化時のリスト代入形式があった。C++11からは全ての初期化の場面で初期化リスト形式を利用できるようになった。これにより初期化構文の違いに煩わされることはなくなった。

class Point{

std::pair <int , int > point_;

public:

Point(int x, int y) : point_{x, y} {}

// The rest is omitted.

};

Point p1 = Point{1, 2};

Point p2 = {1, 2};

Point p3{1, 2};

Point* p = new Point{1, 2};

9 / 51

Page 14: More C++11

C++11 is何?C++11でできること

まとめ

.. range-for

コンテナ内の全要素を走査するコードは頻繁に書かれるが、これまでの記法は記述コストが少々高くつく。

範囲 for文を用いることですっきり記述できて可読性が向上。要するに構文糖衣。

std:: string str{"range -for"};

for (auto& c : str) {

c += 3;

}

for (const auto& x : {1, 1, 2, 3, 5, 8, 13, 21, 34, 55}) {

std::cout << x << ’\n’;

}

10 / 51

Page 15: More C++11

C++11 is何?C++11でできること

まとめ

.. rvalue reference and move constructor

代入されることが許されない一時的な値を右辺値と呼ぶ。右辺値は指すことができるが左辺値を指すことはできない右辺値参照&&が導入された。右辺値参照を用いるとコピーではなく移動を表現でき、移動コンストラクタと移動代入を定義できる。

class String{

size_t len_;

char* str_;

public:

String(String && src) : len_{src.len_}, str_{src.str_} {

src.len_ = 0;

src.str_ = nullptr;

}

String& operator =( String && src) {

len_ = src.len_;

str_ = src.str_;

src.len_ = 0;

src.str_ = nullptr;

return *this;

}

// The rest is omitted.

};

11 / 51

Page 16: More C++11

C++11 is何?C++11でできること

まとめ

.. ref-qualifier

クラスオブジェクトが左辺値の場合と右辺値の場合とで呼び出されるメンバ関数をオーバーロードできる。関数宣言の末尾に参照修飾子 (&または&&)をつけて区別する。*thisが左辺値のとき&をつけた方、右辺値のとき&&をつけた方にオーバーロード解決される。参照修飾子は省略できるが、参照修飾子を省略した関数と指定した関数とのオーバーロードはできない。

struct Example {

void f()& { std::cout << "lvalue" << std::endl; }

void f()&& { std::cout << "rvalue" << std::endl; }

};

Example g() { return Example {}; }

Example e;

e.f(); // lvalue

g().f(); // rvalue

12 / 51

Page 17: More C++11

C++11 is何?C++11でできること

まとめ

.. decltype and suffix return type syntax

コンパイル時に式から型を取得する decltype演算子がキーワードに追加された。特にテンプレート関数において、これまでは戻り値の型を表現できなかった関数が存在するが、C++11では関数の戻り値を後置する構文や decltype演算子によって表現することが可能になった。戻り値の後置構文は後述のラムダ式の形でよく見られる。

template <class T, class U>

decltype ((* static_cast <T*>(nullptr ))*

(* static_cast <U*>(nullptr ))) mul1(T x, U y) {

return x * y;

}

template <class T, class U>

auto mul2(T x, U y)->decltype(x * y) {

return x * y;

}

13 / 51

Page 18: More C++11

C++11 is何?C++11でできること

まとめ

.. lambda

ラムダ式が導入され、一時的に利用する無名関数オブジェクトを簡便に作成できるようになった。戻り値型は後置構文で指定し、指定を省略した場合はreturn文の式に decltypeした型になる。キャプチャ ([])にラムダ式の作られたスコープ内のローカル変数名をカンマで区切って並べることで、その変数のコピーをラムダ式内に保持でき、変数名に&をつけることでその変数への参照を保持できる。&または=を指定すると、それぞれラムダ式内で用いられた変数の参照またはコピーを自動的に保持する。

std::vector <int > v(10);

std::iota(std:: begin(v), std::end(v), 1);

int sum=0;

std:: for_each(std:: begin(v), std::end(v),

[&]( int x) { sum += x; });

14 / 51

Page 19: More C++11

C++11 is何?C++11でできること

まとめ

.. variadic templates

可変長引数を取るテンプレートを作成する機構が導入された。これを用いてタプル (std::tuple)や型安全な可変長引数関数を作成できるようになった。

テンプレート定義時に、テンプレート仮引数の左側(typenameキーワードまたは classキーワードの右側)にpack演算子...をつけることで、テンプレート仮引数が0個以上の型のまとまりである可変長テンプレート仮引数であることを表現する。可変長テンプレート仮引数や可変長仮引数の右側に unpack演算子...をつけることで、その仮引数がカンマで区切られた型および仮引数の列に展開される。

可変長テンプレート仮引数に対して用いることで仮引数の個数を返す sizeof...演算子が導入された。

15 / 51

Page 20: More C++11

C++11 is何?C++11でできること

まとめ

.. variadic templates

void printf(const char* s) {

while(s && *s) {

if (*s == ’%’ && *++s != ’%’)

throw std:: runtime_error("missing arguments");

std::cout << *s++;

}

}

template <typename T, typename ... Args >

void printf(const char* s, T value , Args ... args) {

while (s && *s) {

if (*s == ’%’ && *++s != ’%’) {

std::cout << value;

return printf (++s, args ...);

}

std::cout << *s++;

}

throw std:: runtime_error("extra arguments");

}

16 / 51

Page 21: More C++11

C++11 is何?C++11でできること

まとめ

.. strongly typed enum

これまでの enumは型安全ではなく、前方宣言できず、外部の名前空間を侵していた。C++11からはスコープを持つ強く型付けされた enumを作ることができるようになり、列挙体をより厳密に扱うことができるようになった。

enum class TrafficLight : int; // forward declaration

// char -based

enum class Color : char {red , green , blue ,};

// int -based

enum class TrafficLight {red , yellow , green};

Color c = Color::red;

TrafficLight tl = TrafficLight ::red;

enum Number {ONE , TWO , THREE}; // old enum

int n = ONE; // no scope

n = Number ::TWO; // allowed to specify scope since C++11

17 / 51

Page 22: More C++11

C++11 is何?C++11でできること

まとめ

.. constexpr

これまではコンパイル時に定数を得るためにはテンプレートやマクロを使ってハックするしかなかった。

C++11から導入された constexprキーワードによって、コンパイル時に実行される関数とコンパイル時定数を表現することができるようになった。

constexpr指定された変数は、初期値としてコンパイル時定数をとり、コンパイル時定数として利用できる。

constexpr指定された関数は、再帰できないなどの若干の関数機能の制限があるものの、引数が全てコンパイル時定数ならばコンパイル時に計算されて、戻り値をコンパイル時定数として利用できる。コンパイル時定数でない引数があれば戻り値は実行時に計算される。

18 / 51

Page 23: More C++11

C++11 is何?C++11でできること

まとめ

.. constexpr

enum class Flags {good=0, fail=1, bad=2, eof =4};

constexpr Flags operator |( Flags f1, Flags f2) {

return static_cast <Flags >(

static_cast <int >(f1) | static_cast <int >(f2));

}

switch (flag) {

case Flags::bad:

/*do something */

break;

case Flags::eof:

/*do something */

break;

case Flags::bad | Flags ::eof:

/*do something */

break;

default:

/*do something */

break;

}

19 / 51

Page 24: More C++11

C++11 is何?C++11でできること

まとめ

.. non-static member initializer

これまではクラス内で初期化できるメンバは staticでconstな整数型に限られていた。C++11からは static constでなくても、宣言された時点で初期化できるようになった。コンストラクタでの初期化は宣言時点での初期化を上書きするので、コンストラクタの実装がより便利になった。

class Example {

std:: string str_{"default"};

double d_ {3.14};

public:

Example () {}

Example(char src) : str_{1, src} {}

Example(double src) : d_{src} {}

Example(const std:: string& src) : str_{src} {}

// The rest is omitted.

};

20 / 51

Page 25: More C++11

C++11 is何?C++11でできること

まとめ

.. default and delete

これまではコピーを禁止するためには、コピーコンストラクタを privateにするなど、一見わかりづらいハックをせざるを得なかった。C++11からは関数に deleteを指定することで、その関数の使用を禁止することができる。既定動作を持つコンストラクタなどの関数には default

を指定することで、コンパイラに既定動作をするよう明示することができる。

struct Uncopyable {

Uncopyable () = default; // explicit default

// prohibiting copying

Uncopyable(const Uncopyable &) = delete;

// prohibiting assignment

Uncopyable& operator =( const Uncopyable &) = delete;

};

21 / 51

Page 26: More C++11

C++11 is何?C++11でできること

まとめ

.. delegating constructor

これまでは、似たような挙動をするたくさんのコンストラクタオーバーロードを実装する際には、いちいち同じようなコードを書くか、冗長性を取り除くためのややこしいハックをするしかなかった。C++11からはコンストラクタ内から別のコンストラクタが呼び出せるので、コンストラクタオーバーロードがたくさんでもそんなに困らなくなった。

class Month {

int month_;

public:

Month(int src) : month_{src} {

assert (0 < src && src <= 12);

}

Month(const std:: string& src) : Month{std::stoi(src)} {}

// The rest is omitted.

};

22 / 51

Page 27: More C++11

C++11 is何?C++11でできること

まとめ

.. inherited constructor

これまでは、基底クラスのメンバ関数が派生クラスのメンバ関数によってオーバーロードされて隠れてしまう時に、基底クラスのメンバ関数を usingを用いて派生クラスに取り込むことができた。C++11からはそれに加えてコンストラクタも取り込むことができるようになった。派生クラスの方に新たなメンバ変数があるが基底クラスのコンストラクタを流用したい時には、前述の非静的メンバの初期化を利用すればよい。

class Derived : public Base {

int x_{0};

public:

using Base::Base;

};

23 / 51

Page 28: More C++11

C++11 is何?C++11でできること

まとめ

.. static assert

assertマクロのコンパイル時版となる static assert

キーワードが追加された。第一引数に式、第二引数に文字列を受け取る。コンパイル時に第一引数を評価し、falseならコンパイルエラーとなり第二引数のエラーメッセージを吐く。constexprやテンプレートメタプログラミングと組み合わせると、これまでより格段に高度なデバッグが可能になる。

template <class T, class U>

struct S { T first; U second; };

template <class T, class U>

void f() {

static_assert(sizeof(S<T, U>) == sizeof(T) + sizeof(U),

"unexpected padding in S");

}

24 / 51

Page 29: More C++11

C++11 is何?C++11でできること

まとめ

.. noexcept

関数が例外を投げうるかどうかを指定できる noexcept

演算子が導入された。noexcept演算子は引数の式をコンパイル時に評価し、例外を投げうる式なら falseを返す。引数が trueのnoexcept演算子で関数を修飾することで例外を投げないことを宣言できる。引数を取らない単体の noexceptはnoexcept(true)の省略形である。この機能により従来の throw例外指定は非推奨になった。

template <class T>

void do_f(std::vector <T>& v)

noexcept(noexcept(f(v.at (0)))){

for (int i; i < v.size (); ++i) {

v.at(i) = f(v.at(i));

}

}

25 / 51

Page 30: More C++11

C++11 is何?C++11でできること

まとめ

.. unicode string literal

u8、u、Uを文字列リテラルの先頭に付加することで、それぞれ char型、char16 t型、char32 t型の配列であるUTF-8、UTF-16、UTF-32文字列を表現出来るようになった。

\uの後に 4桁、\Uの後に 8桁の 16進数を指定することでユニバーサルキャラクタ名を指定できるようになった。

wchar_t wc = L’a’;

char16_t u16c = u’\u0061 ’; // \u0061 == a

char32_t u32c = U’\U00000061 ’;

const char* u8s = u8"UTF -8文 字\ u5217"; // \u5217 == 列const wchar_t* ws = L" W I D E文字列 ";

const char16_t* u16s = u"UTF -16文 字 列 ";

const char32_t* u32s = U"UTF -32文 字 列 ";

26 / 51

Page 31: More C++11

C++11 is何?C++11でできること

まとめ

.. raw string literal

バックスラッシュがエスケープシーケンスプレフィックスとして用いられない、raw文字列の表現方法が導入された。

文字列リテラルの先頭に Rを付加すると、"delim(と)delim"v (delimは 0文字以上の任意の文字列)に挟まれた部分が raw文字列として解釈される。Lや前述の u8、u、U接頭辞も併用できる。

const char* rs = R"(/\w\\\w/)"; // /\w\\\w/

const char* u8rs = u8R"(("raw\str"))"; // ("raw\str")

const wchar_t* wrs = LR"+("(raw\str)")+"; // "(raw\str)"

const char16_t* u16rs = uR"***(("))***"; // (")

const char32_t* u32rs = UR"delim ((")) delim"; // (")

27 / 51

Page 32: More C++11

C++11 is何?C++11でできること

まとめ

.. user-defined literal

リテラルの末尾に付加することでユーザ定義の型に変換することができるユーザ定義リテラルを定義できる。

operator""をオーバーロードし、数値型の場合は const

char*または template<char...>などで raw形式リテラルを直接受け取るか、unsigned long long intなどのcooked形式リテラルで受け取って任意の型で返すようにする。

文字列型の場合は (const char*, size t)で受け取って任意の型で返すようにする。

ユーザが定義する接尾辞はアンダースコアで始まらなければならない。

28 / 51

Page 33: More C++11

C++11 is何?C++11でできること

まとめ

.. user-defined literal

template <char ... Chars >

std:: string operator"" _to_string () {

std:: string ret;

for (const auto& c

: std:: initializer_list <char >{Chars ...}) {

ret.push_back(c);

}

return ret;

}

std:: string operator"" _s(const char* str , size_t) {

return std:: string{str};

}

constexpr std::complex <double > operator"" _i(

long double d) {

return {0.0, static_cast <double >(d)};

}

std:: string str1 = 12345 _to_string; // "12345"

std:: string str2 = "std:: string"_s.substr (0,3); // "std"

std::complex <double > c = 2.0 + 3.0_i; // {2.0, 3.0}

29 / 51

Page 34: More C++11

C++11 is何?C++11でできること

まとめ

.. explicit conversion operator

これまでコンストラクタにしか指定出来なかったexplicitキーワードを変換演算子にも指定できるようになった。

template <class T>

class SmartPtr {

T* ptr_;

public:

explicit SmartPtr(const T& src) : ptr_{new T{src}} {}

explicit operator bool() {

return ptr_ != nullptr;

}

// The rest is omitted.

};

30 / 51

Page 35: More C++11

C++11 is何?C++11でできること

まとめ

.. template alias

usingを用いて、テンプレート引数が部分的に束縛されたテンプレートを書く手段が提供された。

テンプレートの別名だけでなく、typedefの代わりに使うことも可能になった。

template <class T>

using Vec = std::vector <T, MyAllocator <T>>;

typedef int(* FUNCPTR_OLD )(); // until C++11

using FUNCPTR = int (*)(); // since C++11

31 / 51

Page 36: More C++11

C++11 is何?C++11でできること

まとめ

..

default template arguments for functiontemplate

テンプレート関数のテンプレート引数にデフォルト引数を渡すことができるようになった。

template <class T, class U = double >

void f(T t = 0, U u = 0);

void g() {

f(1, ’c’); // f<int ,char >(1, ’c’)

f(1); // f<int ,double >(1, 0)

// f(); T?

f<int >(); // f<int ,double >(0, 0)

f<int , char >(); // f<int ,char >(0, 0)

}

32 / 51

Page 37: More C++11

C++11 is何?C++11でできること

まとめ

.. local and unnamed class as template argument

局所型や無名型を template引数に渡すことが可能になった。

template <class T>

void foo(T) {}

enum {e};

struct {} noname;

int main() {

struct Local {} local;

f(e);

f(noname );

f(local );

}

33 / 51

Page 38: More C++11

C++11 is何?C++11でできること

まとめ

.. extern template

externを先頭につけてテンプレート宣言することで、その翻訳単位におけるテンプレートの実体化を抑制できる。

// one.cpp

template class std::vector <int >;

// use std::vector <int >

// two.cpp

extern template class std::vector <int >;

// use std::vector <int >

// three.cpp

extern template class std::vector <int >;

// use std::vector <int >

34 / 51

Page 39: More C++11

C++11 is何?C++11でできること

まとめ

..

extending sizeof and extended frienddeclaration

staticでないメンバ変数のサイズを、インスタンス化することなく sizeofで取得できるようになった。

friend宣言にテンプレートパラメータや typedef名を指定できるようになった。

template <class T>

struct Example {

int hoge;

friend T;

};

struct Foo{};

constexpr size_t hogesize = sizeof(Example <int >:: hoge);

Example <Foo > ef; // Foo is a friend of Example <Foo >.

Example <int > ei; // friend int is ignored.

35 / 51

Page 40: More C++11

C++11 is何?C++11でできること

まとめ

.. preventing narrowing

浮動小数点数から整数への暗黙変換などの、縮小変換を伴う初期化が C++11からはコンパイルエラーになった。浮動小数点型から整数型への暗黙変換は禁止され、整数型から文字型への変換は、具体的にその数値が文字型が表現可能な範囲に収まっていなければコンパイルエラーになる。

double d{3.14};

// int i1{3.14} , i2{d}; compile error

// std::vector <int > vi = {1,2,d}; compile error

char c1 {42};

// char c2 {12345}; compile error

36 / 51

Page 41: More C++11

C++11 is何?C++11でできること

まとめ

.. unrestricted union

共用体のメンバとなれる型の条件が変更され、より柔軟になった。

これまではユーザ定義のコンストラクタやデストラクタなどを持つ型は共用体のメンバになれなかったが、C++11からは参照を除く全ての型が共用体のメンバになれるようになった。

ただし、ユーザ定義のコンストラクタ、コピーコンストラクタ、コピー代入演算子、デストラクタを持つ場合、そのメンバを持つ共用体に対してそれらのデフォルト関数が暗黙的に生成されない。その共用体がクラス内の匿名共用体の場合はそのクラスに対して暗黙的に生成されない。

37 / 51

Page 42: More C++11

C++11 is何?C++11でできること

まとめ

.. unrestricted unionclass Example {

enum class Tag {number , text} type_;

union { int i_; std:: string s_; };

public:

Example(int src) : type_{Tag:: number}, i_{src} {}

Example(const std:: string& src) : type_{Tag::text}, s_{src} {}

Example(const Example& rhs) {*this = rhs;}

~Example () {if (type_ == Tag::text) s_.~ basic_string ();}

Example& operator =(const Example& rhs) {

if (type_ == Tag::text) {

if (rhs.type_ == Tag::text) {

s_ = rhs.s_;

return *this;

} else {

s_.~ basic_string ();

}

}

switch (type_ = rhs.type_) {

case Tag:: number:

i_ = rhs.i_; break;

case Tag::text:

new(&s_) std:: string{rhs.s_}; break;

}

return *this;

}

// The rest is omitted.

};

38 / 51

Page 43: More C++11

C++11 is何?C++11でできること

まとめ

.. attribute

これまでコンパイラごとに存在した独自拡張属性を指定する一般的な構文が規格に追加された。任意の追加情報を [[]]で囲んで指定する。

仮想関数に対して修飾することでオーバーライドを明示する overrideとオーバーライドを禁止する finalが導入された。この 2つは文脈キーワードで、通常の識別子としても使えるが、仮想関数への修飾子として使われる文脈においてのみキーワードとして解釈される。

変数のアラインメントを指定する alignas演算子と、型のアラインメントを返す alignof演算子が追加された。

39 / 51

Page 44: More C++11

C++11 is何?C++11でできること

まとめ

.. attribute

struct Base {

virtual void f() const;

virtual void g[[ noreturn ]]() final;

};

struct Derived : public Base {

void f() const override;

//void g() override;

};

alignas(float) unsigned char override[sizeof(float )];

constexpr int final=alignof(int);

40 / 51

Page 45: More C++11

C++11 is何?C++11でできること

まとめ

.. C99 features

C99の機能のいくつかが C++11にも導入された。long long int型。少なくとも 64bitの整数を格納する。longや shortと同様に intを修飾し、long long

のように intを省略することもできる。現在の関数名が格納される func 。STDC HOSTED マクロ。

#pragma Xに展開される Pragma演算子。可変長引数マクロ。空のマクロ引数の許容。その他 C99ライブラリ。etc.

41 / 51

Page 46: More C++11

C++11 is何?C++11でできること

まとめ

.. others

cplusplusマクロの値が 199711Lより大きくなった。具体的には 201103Lであるコンパイラが多いようです。テンプレートにおいて、閉じ山括弧が 2つ並ぶと、これまでは右シフト演算子に解釈されて構文エラーとなったが、C++11からはちゃんと読み取ってくれるようになった。各スレッドごとに独立したグローバル変数、静的変数を作るための記憶クラス指定子 thread localが導入された。POD(Plain Old Data)の定義がより柔軟になった。SFINAEの仕様が明確化された。namespaceを inlineにすることで、その名前空間を透過的にすることができるようになった。

42 / 51

Page 47: More C++11

C++11 is何?C++11でできること

まとめ

.. 便利なライブラリ群

containers and algorithms improvementnew containers

array, forward list, initializer list, tuple

thread support libraryregular expression librarysmart pointers

shared ptr, unique ptr, weak ptr

random number generatorsfunction objects

function, mem fn, bind, ref, etc.<chrono>

<type traits>

and more!comming soon!

43 / 51

Page 48: More C++11

C++11 is何?C++11でできること

まとめ

.. C++11の利用方法

C++11はつい最近確定したばかりの巨大な規格なので、C++11対応したコンパイラはまだ少ないのが現状。例えば gccでは、gcc4.3以降で-std=c++11オプション(-std=c++11の cは小文字なので注意)を指定することで C++11のコードとしてコンパイルできる。ちなみに今回のスライドのコードスニペットは一部(ref-qualifier, inheriting constructor, attribute, alignment,thread local)を除き gcc version 4.7.2で確認。もはや C++03でコードを書くことは大きな損失に他なりません。これから C++を使うときは是非 C++11を使いましょう。

44 / 51

Page 49: More C++11

C++11 is何?C++11でできること

まとめ

.. コンパイラの対応状況

gccはかなり対応してきました。4.8でほとんど対応して、4.9には完全対応できそうな勢い。

Clangが gccと双璧を成して C++11準拠度が高いです。て言うかほとんど二択です。

VC++、おまえはだめだ。

45 / 51

Page 50: More C++11

C++11 is何?C++11でできること

まとめ

.. コンパイラの対応状況

gccはかなり対応してきました。4.8でほとんど対応して、4.9には完全対応できそうな勢い。Clangが gccと双璧を成して C++11準拠度が高いです。て言うかほとんど二択です。

VC++、おまえはだめだ。

45 / 51

Page 51: More C++11

C++11 is何?C++11でできること

まとめ

.. コンパイラの対応状況

gccはかなり対応してきました。4.8でほとんど対応して、4.9には完全対応できそうな勢い。Clangが gccと双璧を成して C++11準拠度が高いです。て言うかほとんど二択です。

VC++、おまえはだめだ。

45 / 51

Page 52: More C++11

C++11 is何?C++11でできること

まとめ

.. コンパイラの対応状況Feature gcc Clang VC++auto GCC 4.4 Clang 2.9 VC10nullptr GCC 4.6 Clang 3.0 VC10初期化リスト GCC 4.4 Clang 3.1 VC12CTP範囲 for GCC 4.6 Clang 3.0 VC11右辺値参照 GCC 4.3 Clang 2.9 VC11移動コンストラクタ before 4.3 Clang 2.9 N/Aメンバ関数の参照修飾 N/A Clang 2.9 N/Adecltype GCC 4.3 Clang 2.9 VC11後置戻り値構文 GCC 4.4 Clang 2.9 VC10ラムダ GCC 4.5 Clang 3.1 VC11可変長テンプレート GCC 4.3 Clang 2.9 VC12CTP強く型付けされた列挙型      GCC 4.4 Clang 2.9 VC11列挙型の前方宣言 GCC 4.6 Clang 3.1 VC11コンパイル時定数式 GCC 4.6 Clang 3.1 Partial非静的メンバの初期化 GCC 4.7 Clang 3.0 N/A関数の default指定 GCC 4.4 Clang 3.0 N/A関数の delete指定 GCC 4.4 Clang 2.9 N/A委譲コンストラクタ GCC 4.7 Clang 3.0 VC12CTP継承コンストラクタ GCC 4.8 N/A N/Astatic assert GCC 4.3 Clang 2.9 VC10noexcept GCC 4.6 Clang 3.0 N/A

46 / 51

Page 53: More C++11

C++11 is何?C++11でできること

まとめ

.. コンパイラの対応状況Feature gcc Clang VC++Unicode文字列リテラル GCC 4.5 Clang 3.0 N/Aユニバーサルキャラクタ名 GCC 4.5 Clang 3.1 N/Araw文字列リテラル GCC 4.5 Clang 3.0 VC12CTPユーザ定義リテラル GCC 4.7 Clang 3.1 N/Aexplicit変換演算子 GCC 4.5 Clang 3.0 VC12CTP別名テンプレート GCC 4.7 Clang 3.0 N/Aデフォルトテンプレート引数 GCC 4.3 Clang 2.9 VC12CTP局所型や無名型の template引数渡し GCC 4.5 Clang 2.9 VC10externテンプレート宣言 before 4.3 Clang 2.9 VC10拡張 sizeof GCC 4.4 Clang 3.1 N/A拡張 friend宣言 GCC 4.7 Clang 2.9 VC10無制限共用体 GCC 4.6 Clang 3.1 N/Aアトリビュート GCC 4.8 N/A N/Aoverrideと final GCC 4.7 Clang 3.0 VC11alignas演算子と alignof演算子 GCC 4.8 N/A Partiallong long int型 GCC 4.3 Clang 2.9 VC10

func GCC 4.3 Clang 2.9 PartialC99プリプロセッサ GCC 4.3 Clang 2.9 Partialthread local GCC 4.8 N/A PartialPOD GCC 4.5 Clang 3.0 VC11SFINAE GCC 4.4 Clang 2.9 N/A

47 / 51

Page 54: More C++11

C++11 is何?C++11でできること

まとめ

.. まとめ

C++11は書きやすく、読みやすく、また速いコードを簡単に書くことができる!素晴らしい!

48 / 51

Page 55: More C++11

C++11 is何?C++11でできること

まとめ

.. 参考文献

.C++11 FAQ........http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja

.C++11 - Wikipedia........http://ja.wikipedia.org/wiki/C%2B%2B11

.本の虫........http://cpplover.blogspot.com/

.C++0xの言語拡張まとめ (※随時更新) - Faith and Brave -C++で遊ぼう........http://d.hatena.ne.jp/faith and brave/20071022/1193052163

49 / 51

Page 56: More C++11

C++11 is何?C++11でできること

まとめ

.. 参考文献

.C++0x/C++11 Support in GCC - GNU Project - FreeSoftware Foundation (FSF)........http://gcc.gnu.org/projects/cxx0x.html

.Clang - C++98 and C++11 Status........http://clang.llvm.org/cxx status.html

.C++11の機能 (Modern C++)..

......http://msdn.microsoft.com/ja-jp/library/vstudio/hh567368.aspx

50 / 51

Page 57: More C++11

C++11 is何?C++11でできること

まとめ

.. 参考文献

.Announcing November CTP of the C++ compiler, now withmore C++11 - Visual C++ Team Blog - Site Home - MSDNBlogs..

......http://blogs.msdn.com/b/vcblog/archive/2012/11/02/visual-c-c-11-and-the-future-of-c.aspx

51 / 51