10. C++11 is 何?
C++11 でできること
まとめ
.. auto
これまで auto キーワードはほとんど無意味な記憶クラス
指定子だったが、この度非常に強力な機能を持って生ま
れ変わった。
型として初期化に用いることで、初期化式からの型推論
によって得られた型に自動的に置き換えられる。
後述の戻り値を後置する関数宣言構文にも用いられる。
auto x = 42; // int x;
auto y = 0.0f; // float y;
6 / 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
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
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
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
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