More Related Content Similar to More C++11 (20) More from 京大 マイコンクラブ (20) More C++111. C++11 is 何?
C++11 でできること
まとめ
.
...... More C++11
hatsusato
京都大学理学部もうすぐ 2 回
2013 年 3 月 21 日
1 / 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