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でできること
まとめ
.. 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
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でできること
まとめ
.. 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
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
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
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