SlideShare a Scribd company logo
1 of 57
Download to read offline
C++11 is 何?
C++11 でできること
まとめ
.
...... More C++11
hatsusato
京都大学理学部もうすぐ 2 回
2013 年 3 月 21 日
1 / 51
C++11 is 何?
C++11 でできること
まとめ
.. 自己紹介
@hatsusato のプロフィール
2 / 51
C++11 is 何?
C++11 でできること
まとめ
.. 自己紹介
@hatsusato のプロフィール
C++一筋
理学部数学系志望
げんごつくる
2 / 51
C++11 is 何?
C++11 でできること
まとめ
.. 自己紹介
@hatsusato のプロフィール
C++一筋
理学部数学系志望
げんごつくる
アニメ好き作画オタク
カラオケ行きたい
2 / 51
C++11 is 何?
C++11 でできること
まとめ
.. 目次
...1 C++11 is 何?
...2 C++11 でできること
...3 まとめ
3 / 51
C++11 is 何?
C++11 でできること
まとめ
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
4 / 51
C++11 is 何?
C++11 でできること
まとめ
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
コア言語の機能が拡張され、今までに出来なかったり、
面倒くさい遠回りをして実現していたたくさんのことが
簡単にできるように。
標準ライブラリも大きく拡充され、たくさんの便利なラ
イブラリが簡単に利用できるように。
それでいて実行時速度は変わらないか、むしろ速く
なった。
4 / 51
C++11 is 何?
C++11 でできること
まとめ
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
コア言語の機能が拡張され、今までに出来なかったり、
面倒くさい遠回りをして実現していたたくさんのことが
簡単にできるように。
標準ライブラリも大きく拡充され、たくさんの便利なラ
イブラリが簡単に利用できるように。
それでいて実行時速度は変わらないか、むしろ速く
なった。
要するに C++11 最高。
4 / 51
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
C++11 is 何?
C++11 でできること
まとめ
.. auto
これまで auto キーワードはほとんど無意味な記憶クラス
指定子だったが、この度非常に強力な機能を持って生ま
れ変わった。
型として初期化に用いることで、初期化式からの型推論
によって得られた型に自動的に置き換えられる。
後述の戻り値を後置する関数宣言構文にも用いられる。
auto x = 42; // int x;
auto y = 0.0f; // float y;
6 / 51
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
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
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
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
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
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
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
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
C++11 is 何?
C++11 でできること
まとめ
.. variadic templates
可変長引数を取るテンプレートを作成する機構が導入さ
れた。これを用いてタプル (std::tuple) や型安全な可変
長引数関数を作成できるようになった。
テンプレート定義時に、テンプレート仮引数の左側
(typename キーワードまたは class キーワードの右側) に
pack 演算子... をつけることで、テンプレート仮引数が
0 個以上の型のまとまりである可変長テンプレート仮引
数であることを表現する。可変長テンプレート仮引数や
可変長仮引数の右側に unpack 演算子... をつけること
で、その仮引数がカンマで区切られた型および仮引数の
列に展開される。
可変長テンプレート仮引数に対して用いることで仮引数
の個数を返す sizeof... 演算子が導入された。
15 / 51
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
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
C++11 is 何?
C++11 でできること
まとめ
.. constexpr
これまではコンパイル時に定数を得るためにはテンプ
レートやマクロを使ってハックするしかなかった。
C++11 から導入された constexpr キーワードによって、
コンパイル時に実行される関数とコンパイル時定数を表
現することができるようになった。
constexpr 指定された変数は、初期値としてコンパイル
時定数をとり、コンパイル時定数として利用できる。
constexpr 指定された関数は、再帰できないなどの若干
の関数機能の制限があるものの、引数が全てコンパイル
時定数ならばコンパイル時に計算されて、戻り値をコン
パイル時定数として利用できる。コンパイル時定数でな
い引数があれば戻り値は実行時に計算される。
18 / 51
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
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
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
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
C++11 is 何?
C++11 でできること
まとめ
.. inherited constructor
これまでは、基底クラスのメンバ関数が派生クラスのメ
ンバ関数によってオーバーロードされて隠れてしまう時
に、基底クラスのメンバ関数を using を用いて派生クラ
スに取り込むことができた。
C++11 からはそれに加えてコンストラクタも取り込むこ
とができるようになった。
派生クラスの方に新たなメンバ変数があるが基底クラス
のコンストラクタを流用したい時には、前述の非静的メ
ンバの初期化を利用すればよい。
class Derived : public Base {
int x_ {0};
public:
using Base :: Base;
};
23 / 51
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
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
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
C++11 is 何?
C++11 でできること
まとめ
.. raw string literal
バックスラッシュがエスケープシーケンスプレフィック
スとして用いられない、raw 文字列の表現方法が導入さ
れた。
文字列リテラルの先頭に R を付加すると、
"delim(と)delim"v (delim は 0 文字以上の任意の文字
列) に挟まれた部分が raw 文字列として解釈される。L や
前述の u8、u、U 接頭辞も併用できる。
const char* rs = R"(/ww/)"; // /ww/
const char* u8rs = u8R"(("rawstr"))"; // (" rawstr ")
const wchar_t* wrs = LR"+("(rawstr)")+"; // "(rawstr )"
const char16_t* u16rs = uR"***(("))***"; // (")
const char32_t* u32rs = UR"delim ((")) delim"; // (")
27 / 51
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
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
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
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
C++11 is 何?
C++11 でできること
まとめ
..
default template arguments for function
template
テンプレート関数のテンプレート引数にデフォルト引数
を渡すことができるようになった。
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
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
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
C++11 is 何?
C++11 でできること
まとめ
..
extending sizeof and extended friend
declaration
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
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
C++11 is 何?
C++11 でできること
まとめ
.. unrestricted union
共用体のメンバとなれる型の条件が変更され、より柔軟
になった。
これまではユーザ定義のコンストラクタやデストラクタ
などを持つ型は共用体のメンバになれなかったが、
C++11 からは参照を除く全ての型が共用体のメンバにな
れるようになった。
ただし、ユーザ定義のコンストラクタ、コピーコンスト
ラクタ、コピー代入演算子、デストラクタを持つ場合、
そのメンバを持つ共用体に対してそれらのデフォルト関
数が暗黙的に生成されない。その共用体がクラス内の匿
名共用体の場合はそのクラスに対して暗黙的に生成され
ない。
37 / 51
C++11 is 何?
C++11 でできること
まとめ
.. unrestricted union
class 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
C++11 is 何?
C++11 でできること
まとめ
.. attribute
これまでコンパイラごとに存在した独自拡張属性を指定
する一般的な構文が規格に追加された。任意の追加情報
を [[]] で囲んで指定する。
仮想関数に対して修飾することでオーバーライドを明示
する override とオーバーライドを禁止する final が導
入された。この 2 つは文脈キーワードで、通常の識別子
としても使えるが、仮想関数への修飾子として使われる
文脈においてのみキーワードとして解釈される。
変数のアラインメントを指定する alignas 演算子と、型
のアラインメントを返す alignof 演算子が追加された。
39 / 51
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
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
C++11 is 何?
C++11 でできること
まとめ
.. others
cplusplus マクロの値が 199711L より大きくなった。
具体的には 201103L であるコンパイラが多いようです。
テンプレートにおいて、閉じ山括弧が 2 つ並ぶと、これ
までは右シフト演算子に解釈されて構文エラーとなった
が、C++11 からはちゃんと読み取ってくれるように
なった。
各スレッドごとに独立したグローバル変数、静的変数を
作るための記憶クラス指定子 thread local が導入さ
れた。
POD(Plain Old Data) の定義がより柔軟になった。
SFINAE の仕様が明確化された。
namespace を inline にすることで、その名前空間を透過
的にすることができるようになった。
42 / 51
C++11 is 何?
C++11 でできること
まとめ
.. 便利なライブラリ群
containers and algorithms improvement
new containers
array, forward list, initializer list, tuple
thread support library
regular expression library
smart pointers
shared ptr, unique ptr, weak ptr
random number generators
function objects
function, mem fn, bind, ref, etc.
<chrono>
<type traits>
and more!
comming soon!
43 / 51
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
C++11 is 何?
C++11 でできること
まとめ
.. コンパイラの対応状況
gcc はかなり対応してきました。4.8 でほとんど対応し
て、4.9 には完全対応できそうな勢い。
45 / 51
C++11 is 何?
C++11 でできること
まとめ
.. コンパイラの対応状況
gcc はかなり対応してきました。4.8 でほとんど対応し
て、4.9 には完全対応できそうな勢い。
Clang が gcc と双璧を成して C++11 準拠度が高いです。
て言うかほとんど二択です。
45 / 51
C++11 is 何?
C++11 でできること
まとめ
.. コンパイラの対応状況
gcc はかなり対応してきました。4.8 でほとんど対応し
て、4.9 には完全対応できそうな勢い。
Clang が gcc と双璧を成して C++11 準拠度が高いです。
て言うかほとんど二択です。
VC++、おまえはだめだ。
45 / 51
C++11 is 何?
C++11 でできること
まとめ
.. コンパイラの対応状況
Feature gcc Clang VC++
auto GCC 4.4 Clang 2.9 VC10
nullptr 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/A
decltype 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/A
static assert GCC 4.3 Clang 2.9 VC10
noexcept GCC 4.6 Clang 3.0 N/A
46 / 51
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/A
raw 文字列リテラル GCC 4.5 Clang 3.0 VC12CTP
ユーザ定義リテラル GCC 4.7 Clang 3.1 N/A
explicit 変換演算子 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 VC10
extern テンプレート宣言 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/A
override と final GCC 4.7 Clang 3.0 VC11
alignas 演算子と alignof 演算子 GCC 4.8 N/A Partial
long long int 型 GCC 4.3 Clang 2.9 VC10
func GCC 4.3 Clang 2.9 Partial
C99 プリプロセッサ GCC 4.3 Clang 2.9 Partial
thread local GCC 4.8 N/A Partial
POD GCC 4.5 Clang 3.0 VC11
SFINAE GCC 4.4 Clang 2.9 N/A
47 / 51
C++11 is 何?
C++11 でできること
まとめ
.. まとめ
C++11 は書きやすく、読みやすく、また速いコードを簡単に
書くことができる!素晴らしい!
48 / 51
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
C++11 is 何?
C++11 でできること
まとめ
.. 参考文献
.
C++0x/C++11 Support in GCC - GNU Project - Free
Software 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
C++11 is 何?
C++11 でできること
まとめ
.. 参考文献
.
Announcing November CTP of the C++ compiler, now with
more C++11 - Visual C++ Team Blog - Site Home - MSDN
Blogs
..
......
http://blogs.msdn.com/b/vcblog/archive/2012/11/02/visual-c-
c-11-and-the-future-of-c.aspx
51 / 51

More Related Content

What's hot

BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
C++入門?
C++入門?C++入門?
C++入門?tsudaa
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング道化師 堂華
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2sunaemon
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 

What's hot (20)

BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
C++入門?
C++入門?C++入門?
C++入門?
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Map
MapMap
Map
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 

Similar to More C++11

C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編道化師 堂華
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_finalCryolite
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)Akira Takahashi
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
C++ lecture-1
C++ lecture-1C++ lecture-1
C++ lecture-1sunaemon
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Takaaki Suzuki
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 

Similar to More C++11 (20)

C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_final
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
C++ lecture-1
C++ lecture-1C++ lecture-1
C++ lecture-1
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
What is template
What is templateWhat is template
What is template
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 

More from 京大 マイコンクラブ

かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話京大 マイコンクラブ
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 

More from 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 

More C++11

  • 1. C++11 is 何? C++11 でできること まとめ . ...... More C++11 hatsusato 京都大学理学部もうすぐ 2 回 2013 年 3 月 21 日 1 / 51
  • 2. C++11 is 何? C++11 でできること まとめ .. 自己紹介 @hatsusato のプロフィール 2 / 51
  • 3. C++11 is 何? C++11 でできること まとめ .. 自己紹介 @hatsusato のプロフィール C++一筋 理学部数学系志望 げんごつくる 2 / 51
  • 4. C++11 is 何? C++11 でできること まとめ .. 自己紹介 @hatsusato のプロフィール C++一筋 理学部数学系志望 げんごつくる アニメ好き作画オタク カラオケ行きたい 2 / 51
  • 5. C++11 is 何? C++11 でできること まとめ .. 目次 ...1 C++11 is 何? ...2 C++11 でできること ...3 まとめ 3 / 51
  • 6. C++11 is 何? C++11 でできること まとめ .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 4 / 51
  • 7. C++11 is 何? C++11 でできること まとめ .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 コア言語の機能が拡張され、今までに出来なかったり、 面倒くさい遠回りをして実現していたたくさんのことが 簡単にできるように。 標準ライブラリも大きく拡充され、たくさんの便利なラ イブラリが簡単に利用できるように。 それでいて実行時速度は変わらないか、むしろ速く なった。 4 / 51
  • 8. C++11 is 何? C++11 でできること まとめ .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 コア言語の機能が拡張され、今までに出来なかったり、 面倒くさい遠回りをして実現していたたくさんのことが 簡単にできるように。 標準ライブラリも大きく拡充され、たくさんの便利なラ イブラリが簡単に利用できるように。 それでいて実行時速度は変わらないか、むしろ速く なった。 要するに C++11 最高。 4 / 51
  • 9. 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
  • 10. C++11 is 何? C++11 でできること まとめ .. auto これまで auto キーワードはほとんど無意味な記憶クラス 指定子だったが、この度非常に強力な機能を持って生ま れ変わった。 型として初期化に用いることで、初期化式からの型推論 によって得られた型に自動的に置き換えられる。 後述の戻り値を後置する関数宣言構文にも用いられる。 auto x = 42; // int x; auto y = 0.0f; // float y; 6 / 51
  • 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
  • 12. 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
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. 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
  • 19. C++11 is 何? C++11 でできること まとめ .. variadic templates 可変長引数を取るテンプレートを作成する機構が導入さ れた。これを用いてタプル (std::tuple) や型安全な可変 長引数関数を作成できるようになった。 テンプレート定義時に、テンプレート仮引数の左側 (typename キーワードまたは class キーワードの右側) に pack 演算子... をつけることで、テンプレート仮引数が 0 個以上の型のまとまりである可変長テンプレート仮引 数であることを表現する。可変長テンプレート仮引数や 可変長仮引数の右側に unpack 演算子... をつけること で、その仮引数がカンマで区切られた型および仮引数の 列に展開される。 可変長テンプレート仮引数に対して用いることで仮引数 の個数を返す sizeof... 演算子が導入された。 15 / 51
  • 20. 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
  • 21. 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
  • 22. C++11 is 何? C++11 でできること まとめ .. constexpr これまではコンパイル時に定数を得るためにはテンプ レートやマクロを使ってハックするしかなかった。 C++11 から導入された constexpr キーワードによって、 コンパイル時に実行される関数とコンパイル時定数を表 現することができるようになった。 constexpr 指定された変数は、初期値としてコンパイル 時定数をとり、コンパイル時定数として利用できる。 constexpr 指定された関数は、再帰できないなどの若干 の関数機能の制限があるものの、引数が全てコンパイル 時定数ならばコンパイル時に計算されて、戻り値をコン パイル時定数として利用できる。コンパイル時定数でな い引数があれば戻り値は実行時に計算される。 18 / 51
  • 23. 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
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. C++11 is 何? C++11 でできること まとめ .. inherited constructor これまでは、基底クラスのメンバ関数が派生クラスのメ ンバ関数によってオーバーロードされて隠れてしまう時 に、基底クラスのメンバ関数を using を用いて派生クラ スに取り込むことができた。 C++11 からはそれに加えてコンストラクタも取り込むこ とができるようになった。 派生クラスの方に新たなメンバ変数があるが基底クラス のコンストラクタを流用したい時には、前述の非静的メ ンバの初期化を利用すればよい。 class Derived : public Base { int x_ {0}; public: using Base :: Base; }; 23 / 51
  • 28. 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
  • 29. 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
  • 30. 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
  • 31. C++11 is 何? C++11 でできること まとめ .. raw string literal バックスラッシュがエスケープシーケンスプレフィック スとして用いられない、raw 文字列の表現方法が導入さ れた。 文字列リテラルの先頭に R を付加すると、 "delim(と)delim"v (delim は 0 文字以上の任意の文字 列) に挟まれた部分が raw 文字列として解釈される。L や 前述の u8、u、U 接頭辞も併用できる。 const char* rs = R"(/ww/)"; // /ww/ const char* u8rs = u8R"(("rawstr"))"; // (" rawstr ") const wchar_t* wrs = LR"+("(rawstr)")+"; // "(rawstr )" const char16_t* u16rs = uR"***(("))***"; // (") const char32_t* u32rs = UR"delim ((")) delim"; // (") 27 / 51
  • 32. 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
  • 33. 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
  • 34. 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
  • 35. 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
  • 36. C++11 is 何? C++11 でできること まとめ .. default template arguments for function template テンプレート関数のテンプレート引数にデフォルト引数 を渡すことができるようになった。 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
  • 37. 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
  • 38. 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
  • 39. C++11 is 何? C++11 でできること まとめ .. extending sizeof and extended friend declaration 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
  • 40. 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
  • 41. C++11 is 何? C++11 でできること まとめ .. unrestricted union 共用体のメンバとなれる型の条件が変更され、より柔軟 になった。 これまではユーザ定義のコンストラクタやデストラクタ などを持つ型は共用体のメンバになれなかったが、 C++11 からは参照を除く全ての型が共用体のメンバにな れるようになった。 ただし、ユーザ定義のコンストラクタ、コピーコンスト ラクタ、コピー代入演算子、デストラクタを持つ場合、 そのメンバを持つ共用体に対してそれらのデフォルト関 数が暗黙的に生成されない。その共用体がクラス内の匿 名共用体の場合はそのクラスに対して暗黙的に生成され ない。 37 / 51
  • 42. C++11 is 何? C++11 でできること まとめ .. unrestricted union class 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
  • 43. C++11 is 何? C++11 でできること まとめ .. attribute これまでコンパイラごとに存在した独自拡張属性を指定 する一般的な構文が規格に追加された。任意の追加情報 を [[]] で囲んで指定する。 仮想関数に対して修飾することでオーバーライドを明示 する override とオーバーライドを禁止する final が導 入された。この 2 つは文脈キーワードで、通常の識別子 としても使えるが、仮想関数への修飾子として使われる 文脈においてのみキーワードとして解釈される。 変数のアラインメントを指定する alignas 演算子と、型 のアラインメントを返す alignof 演算子が追加された。 39 / 51
  • 44. 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
  • 45. 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
  • 46. C++11 is 何? C++11 でできること まとめ .. others cplusplus マクロの値が 199711L より大きくなった。 具体的には 201103L であるコンパイラが多いようです。 テンプレートにおいて、閉じ山括弧が 2 つ並ぶと、これ までは右シフト演算子に解釈されて構文エラーとなった が、C++11 からはちゃんと読み取ってくれるように なった。 各スレッドごとに独立したグローバル変数、静的変数を 作るための記憶クラス指定子 thread local が導入さ れた。 POD(Plain Old Data) の定義がより柔軟になった。 SFINAE の仕様が明確化された。 namespace を inline にすることで、その名前空間を透過 的にすることができるようになった。 42 / 51
  • 47. C++11 is 何? C++11 でできること まとめ .. 便利なライブラリ群 containers and algorithms improvement new containers array, forward list, initializer list, tuple thread support library regular expression library smart pointers shared ptr, unique ptr, weak ptr random number generators function objects function, mem fn, bind, ref, etc. <chrono> <type traits> and more! comming soon! 43 / 51
  • 48. 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
  • 49. C++11 is 何? C++11 でできること まとめ .. コンパイラの対応状況 gcc はかなり対応してきました。4.8 でほとんど対応し て、4.9 には完全対応できそうな勢い。 45 / 51
  • 50. C++11 is 何? C++11 でできること まとめ .. コンパイラの対応状況 gcc はかなり対応してきました。4.8 でほとんど対応し て、4.9 には完全対応できそうな勢い。 Clang が gcc と双璧を成して C++11 準拠度が高いです。 て言うかほとんど二択です。 45 / 51
  • 51. C++11 is 何? C++11 でできること まとめ .. コンパイラの対応状況 gcc はかなり対応してきました。4.8 でほとんど対応し て、4.9 には完全対応できそうな勢い。 Clang が gcc と双璧を成して C++11 準拠度が高いです。 て言うかほとんど二択です。 VC++、おまえはだめだ。 45 / 51
  • 52. C++11 is 何? C++11 でできること まとめ .. コンパイラの対応状況 Feature gcc Clang VC++ auto GCC 4.4 Clang 2.9 VC10 nullptr 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/A decltype 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/A static assert GCC 4.3 Clang 2.9 VC10 noexcept GCC 4.6 Clang 3.0 N/A 46 / 51
  • 53. 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/A raw 文字列リテラル GCC 4.5 Clang 3.0 VC12CTP ユーザ定義リテラル GCC 4.7 Clang 3.1 N/A explicit 変換演算子 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 VC10 extern テンプレート宣言 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/A override と final GCC 4.7 Clang 3.0 VC11 alignas 演算子と alignof 演算子 GCC 4.8 N/A Partial long long int 型 GCC 4.3 Clang 2.9 VC10 func GCC 4.3 Clang 2.9 Partial C99 プリプロセッサ GCC 4.3 Clang 2.9 Partial thread local GCC 4.8 N/A Partial POD GCC 4.5 Clang 3.0 VC11 SFINAE GCC 4.4 Clang 2.9 N/A 47 / 51
  • 54. C++11 is 何? C++11 でできること まとめ .. まとめ C++11 は書きやすく、読みやすく、また速いコードを簡単に 書くことができる!素晴らしい! 48 / 51
  • 55. 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
  • 56. C++11 is 何? C++11 でできること まとめ .. 参考文献 . C++0x/C++11 Support in GCC - GNU Project - Free Software 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
  • 57. C++11 is 何? C++11 でできること まとめ .. 参考文献 . Announcing November CTP of the C++ compiler, now with more C++11 - Visual C++ Team Blog - Site Home - MSDN Blogs .. ...... http://blogs.msdn.com/b/vcblog/archive/2012/11/02/visual-c- c-11-and-the-future-of-c.aspx 51 / 51