SlideShare uma empresa Scribd logo
1 de 170
次期規格解禁目前! ※この資料の末尾に簡単な補足情報をまとめていますので、  用語等が不明な場合などはそちらを参照してください。 C++0x総復習 Boost.勉強会 #5 名古屋
C++0x総復習 Boost.勉強会 #5 名古屋 (2011-05-14 )
C++0x正式リリース目前! C++0xと呼称されてきた次期C++の国際規格(ISO/IEC 14882)も最終草案(FDIS)が作成され、いよいよ正式リリースの日が迫ってまいりました。 C++0x総復習 Boost.勉強会 #5 名古屋 3
C++0x という名の終わり 正式リリースされればC++0xは旧名となり、そしておそらくはC++11と呼称されるようになります。 C++0x総復習 Boost.勉強会 #5 名古屋 4
C++0xの最新かつ最期の復習 細かな typo の修正等を除けば原則的に正式版とほぼ同一内容(※)となるFDIS(N3290)をベースにC++0xをおさらいしましょう! C++0x総復習 Boost.勉強会 #5 名古屋 5
お断り FDISと正式版は原則的にほぼ同一の内容になるといは言え、その保証があるわけではなく、正式版と差異があったらごめんなさい。 この資料でのセクション(§)およびパラグラフ(¶)の表記はその機能の主要な記述がある箇所であって、実際には他のいくつもの箇所にその機能の記述が散らばっていることが多々あります。 C++0x総復習 Boost.勉強会 #5 名古屋 6
§1General C++0x総復習
§1.10 Multi-threaded executions and data races マルチスレッド実行が言語仕様上、意識されるようになり、マルチスレッドで動作する際の挙動が定義されました。 参考情報: C++0x Memory Model 第0回 - メモリモデルとは何かhttp://d.hatena.ne.jp/Cryolite/20101226#p1 C++0x Memory Model 第1回 - 1.9 Program executionhttp://d.hatena.ne.jp/Cryolite/20101228#p1 C++0x総復習 Boost.勉強会 #5 名古屋 8
§2Lexical conventions C++0x総復習
§2.3 Character sets ユニバーサルキャラクタ名の制限緩和 C++0x総復習 Boost.勉強会 #5 名古屋 10 const char16_t * str16 =             u"905353165E2B"; // 道化師 const char32_t * str32 =              U"000090530000531600005E2B"; // 道化師
§2.11 Identifiers 処理系定義の文字を識別子として使うことが許されるようになりました。 これにより処理系によっては日本語識別子が使えるようになります。 C++0x総復習 Boost.勉強会 #5 名古屋 11
§2.11 Identifiers 特別な意味を持つ識別子が予約されました。 override オーバーライド関数であることの明示。 final [クラスの継承禁止]および[関数のオーバーライド禁止]。 ※特別な識別子であって予約語ではない点に注意。 C++0x総復習 Boost.勉強会 #5 名古屋 12
§2.12 Keywords 予約語が増えました。 予約語一覧(橙色が新しい予約語) alignasalignof   asm   auto   bool   break   case   catch   char   char16_tchar32_t   class   const   const_cast   constexpr   continue   decltype   default   delete   do   double   dynamic_cast   else   enum   explicit   export   extern   false   float   for   friend   goto   if   inline   int   long   mutable   namespace   new   noexceptnullptr   operator   private   protected   public   register   reinterpret_cast   return   short   signed   sizeof   static   static_assert   static_cast   struct   switch   template   this   thread_local   throw   true   try   typedef   typeid   typename   union   unsigned   using   virtual   void   volatile   wchar_t   while C++0x総復習 Boost.勉強会 #5 名古屋 13
§2.12 Keywords alignas アライメントの指定 alignof アライメントの取得 char16_t UNICODE(UTF-16)用の文字型 char32_t UNICODE(UTF-32)用の文字型 constexpr 定数式 C++0x総復習 Boost.勉強会 #5 名古屋 14
§2.12 Keywords decltype 式から型を取得/指定 noexcept 例外送出しないことの明示(指定)と判定(operator) nullptr ナルポインタリテラル static_assert コンパイル時assert thread_local スレッドローカルストレージ C++0x総復習 Boost.勉強会 #5 名古屋 15
§2.14 Literals 追加されたサフィックスとプレフィックス long long 型用の LLサフィックス cha16_t 型用の uプレフィックス cha32_t 型用の Uプレフィックス UTF-8な文字列用の u8プレフィックス cha16_t 型な文字列用の uプレフィックス cha32_t 型な文字列用の Uプレフィックス raw 文字列用の Rプレフィックス C++0x総復習 Boost.勉強会 #5 名古屋 16
§2.14.5 String literals raw文字列リテラル C++0x総復習 Boost.勉強会 #5 名古屋 17 const char *p = R"(abr />b c)"; // == "abc" R"a( )br />a" )a" // == ")aquot;" R"(??)" // ==  ""
§2.14.5 String literals raw文字列リテラル 詳細なかなり珍妙な仕様になっているので要注意。 初期の提案では ( ) でなく [ ] が使われることになっていた為、Web上の多くのraw文字列リテラルに関する情報は[ ]のままになっているので注意。 参考情報: http://d.hatena.ne.jp/haru-s/20081205 C++0x総復習 Boost.勉強会 #5 名古屋 18
§2.14.5 String literals 型の異なる文字列リテラルのコンパイル時の結合規則が定義されました。 片方にエンコーディングプレフィックスがついていない場合、もう片方のエンコーディングプレフィックスに従う。 UTF-8文字列リテラルがワイド文字列リテラルと結合するのは不適格。 それ以外の組み合わせは処理系依存。 C++0x総復習 Boost.勉強会 #5 名古屋 19
§2.14.7 Pointer literals ポインタリテラル std::nullptr_t 型の nullptr 今後は NULL より nullptrを使いましょう! C++0x総復習 Boost.勉強会 #5 名古屋 20
§2.14.8 User-Defined literals ユーザー定義リテラル C++0x総復習 Boost.勉強会 #5 名古屋 21 long double operator ""_w(long double); std::string operator ""_w(const char16_t*, size_t); unsigned operator ""_w(const char*); int main() { 1.2_w;    // calls operator "" _w(1.2L) u"one"_w; // calls operator "" _w(u"one", 3) 12_w;     // calls operator "" _w("12")   "two"_w;  // error: no applicable literal operator }
§2.14.8 User-Defined literals ユーザー定義リテラル 日時リテラル、位置情報リテラル、2進整数リテラル等々、自由にリテラルをユーザー定義できます。 …constexpr で十分じゃないか!という声もありますがw C++0x総復習 Boost.勉強会 #5 名古屋 22
§3Basic concepts C++0x総復習
§3.9.1 Fundamental types 最大の整数型として long long int型が導入されました。 例によって規格上は最大の整数型としか定義されておらず何バイト(何ビット)の値なのかは処理系定義となります。 short intや long intと同様に signed/unsigned  修飾したり int を省略したりできます。 C++0x総復習 Boost.勉強会 #5 名古屋 24
§3.10 Lvalues and rvalues 右辺値/左辺値の定義がより詳細になりました。 C++0x総復習 Boost.勉強会 #5 名古屋 25 式 expression ※便宜上の訳語で正式な訳語でも一般的な訳語でもありません。 汎左辺値※ glvalue 右辺値 rvalue 左辺値 lvalue 純右辺値※ prvalue 末期値※ xvalue
§3.10 Lvalues and rvalues 左辺値 lvalue ( “left-hand” value ) 関数あるいはオブジェクト。 末期値 xvalue ( “eXpiring” value ) 生存期間の終了するオブジェクトの参照。 右辺値参照の結果。 汎左辺値 glvalue ( “generalized” lvalue ) 左辺値(lvalue)あるいは末期値(xvalue)。 右辺値 rvalue ( “right-hand” value ) 末期値(xvalue)、一時オブジェクトあるいはそのサブオブジェクト、オブジェクトに関連づいていない値。 純右辺値 prvalue ( “pure” rvalue ) 末期値(xvalue)でない右辺値(rvalue)。 C++0x総復習 Boost.勉強会 #5 名古屋 26
§3.11 Alignment アライメントがより詳細に定義されました。 処理系がサポートする最大のアライメント: alignof(std::max_align_t) アライメントは std::size_t 型の値で示される。 C++0x総復習 Boost.勉強会 #5 名古屋 27
§4Standard conversions C++0x総復習
§4Standard conversions 主に右辺値/左辺値、char16_t/char32_t、std::nullptr_t、unscoped enumeration 型に関連した trivial な修正。 std::nullptr_t 型の値をboolに変換した場合はfalseになる。(§4.12) Integer conversion rankの定義(§4.13) C++0x総復習 Boost.勉強会 #5 名古屋 29
§5Expressions C++0x総復習
§5.1.2 Lambda expressions ラムダ式が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 31 #include <algorithm> #include <cmath> void abssort(float *x, unsigned N) {   std::sort(x, x + N, [](float a, float b) {       return std::abs(a) < std::abs(b); }); }
§5.1.2 Lambda expressions C++0x総復習 Boost.勉強会 #5 名古屋 32 int a = 42; auto b = [a](){ return a; }; // b 内の a はコピー auto c = [=](){ return a; }; // b と等価 int d = b(); // -> 42 int e = [a](int x){ return a +x; }(d); // そのまま呼び出し auto f = [&a](){ return a; }; // b と違い f 内の a は参照 auto g = [&](){ return a; }; // f と等価 a = 24; int h = b(); // -> 42 int i = f(); // -> 24  auto j = [a,&d](int x){ return a +d +x; }; auto k = [=,&d](int x){return a +d +x; }; // j と等価 auto l = [&]()->int{return a; }; // g と等価(戻り型の明示)
§5.3.6 Alignof 型からアライメントを取得できる alignof が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 33 std::size_t int_alignment = alignof(int);
§5.3.7 noexcept operator 式が例外を送出し得るかどうかを取得できる noexcept operator が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 34 bool is_noexcept_expr = noexcept(a.swap(b));
§5.19 Constant expressions constexpr が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 35 constexpr const int* addr(const int& ir) { return &ir; } // OK static const int x = 5; constexpr const int* xp = addr(x); // OK: (const int*)&(const int&)x is an                                    // address constant expression constexpr const int* tp = addr(5); // error, initializer for constexpr variable not a constant                                    // expression; (const int*)&(const int&)5 is not a constant                                    // expression because it takes the address of a temporary
§5.19 Constant expressions C++0x総復習 Boost.勉強会 #5 名古屋 36 int x;                        // not constant struct A { constexpr A(bool b) : m(b?42:x) { }   int m; }; constexpr int v = A(true).m;  // OK: constructor call initializes                               // m with the value 42 after substitution constexpr int w = A(false).m; // error: initializer for m is                               // x, which is non-constant
§6Statements C++0x総復習
§6.5.4 The range-based for statement 範囲ベースfor文が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 38 int array[5] = { 1, 2, 3, 4, 5 }; for(int& x : array) x *= 2;
§6.7 Declaration statement ¶4 マルチスレッド実行時のグローバル変数およびstatic変数の初期化ルールが定義され、ユーザーコーディングによる初期化の排他処理は不要になりました。 C++0x総復習 Boost.勉強会 #5 名古屋 39
§7Declarations C++0x総復習
§7 Declarations¶4 static_assert が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 41 static_assert(sizeof(long) >= 8, "64-bit code generation required for this library.");
§7.1.1 Storage class specifiers 記憶域種別指定子としての autoが削除されました。 型推論の機能として使う為。 概念としての§3.7.3 Automatic storage duration が無くなったわけではないので注意。 C++0x総復習 Boost.勉強会 #5 名古屋 42
§7.1.1 Storage class specifiers 記憶域種別指定子としての thread_localが導入されました。 この記憶域種が指定された変数はスレッドローカルストレージに格納される値となり、スレッド別に固有の値を持つことができます。 C++0x総復習 Boost.勉強会 #5 名古屋 43
§7.1.6.2 Simple type specifiers 式から型を指定できるdecltypeが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 44 const int&& foo(); int i; struct A { double x; }; const A* a = new A(); decltype(foo()) x1 = i;   // type is const int&& decltype(i) x2;           // type is int decltype(a->x) x3;        // type is double decltype((a->x)) x4 = x3; // type is const double&
§7.1.6.4 auto specifier 型を推論してくれるauto型識別子が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 45 auto x = 5;                // OK: x has type int const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int static auto y = 0.0;       // OK: y has type double auto int r;                // error: auto is not a storage-class-specifier
§7.2 Enumeration declarations 正式に最後の列挙子の末尾にカンマをつけてもいいことになりました。 C++03の規格上は許されてなかったようです。 C++0x総復習 Boost.勉強会 #5 名古屋 46 enum number {  zero,  one,  two, // ←このカンマ };
§7.2 Enumeration declarations scoped enumeration が導入され従来の enum は unscoped enumeration と呼ばれるようになりました。 名前の通り、 scoped enumeration はスコープを持ち列挙子はそのscoped enumeration 型のスコープに所属し、名前空間を汚しません。 int 固定だった enum の内部表現型に任意の整数型を指定できるようになりました。 enum先行宣言ができるようになりました。 この場合、内部表現型の指定は必須となる。 C++0x総復習 Boost.勉強会 #5 名古屋 47
§7.2 Enumeration declarations C++0x総復習 Boost.勉強会 #5 名古屋 48 // unscoped enumeration enum color { red, yellow, green=20, blue }; // scoped enumeration enumclassscoped_color { red, yellow, green=20, blue }; // opaque-enum-declaration enumcolor_byte:unsigned char; // base type is unsigned char enumcolor_byte:unsigned char { red, yellow, green=20, blue };
§7.2 Enumeration declarations scoped enumerationの値と整数値は比較できません。 scoped enumeration の値を整数型の変数に代入することは可能です。 scoped enumeration の変数に整数値を代入することできません。 異なる scoped enumeration 型の値を比較、代入等をすることはできません。 C++0x総復習 Boost.勉強会 #5 名古屋 49
§7.3.1 Namespace definition inline namespace が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 50 namespace a { inline namespace b {    int c;  } } int d = a::b::c; int e = a::c;
§7.6 Attributes 属性が導入されました。 alignas noreturn carries_dependency 他処理系定義 C++0x総復習 Boost.勉強会 #5 名古屋 51
§7.6.2 Alignment specifier alignas アライメントの指定。 指定はバイト数あるいは型名で行う。 これだけ他の属性とは別格で [[ ]] で囲まない。 C++0x総復習 Boost.勉強会 #5 名古屋 52 alignas(4) unsigned char p[sizeof(void*)]; alignas(double) unsigned char c[sizeof(double)]; // array of characters, suitably aligned for a double
§7.6.3 Noreturn attribute noreturn 関数が絶対にreturn しないことの明示。 コンパイラの最適化を助ける為の指定。 C++0x総復習 Boost.勉強会 #5 名古屋 53 [[ noreturn ]] void f() { throw "error"; // OK }
§7.6.4 Carries dependency attribute carries_dependency 依存を関数の内外へ伝播させる指定。 Data-Dependency Orderingを利用する場合などに使う。 参考情報: C++0x時代の Double-Checked Lockinghttp://d.hatena.ne.jp/bsdhouse/20100128/1264693781 C++0x総復習 Boost.勉強会 #5 名古屋 54
§8Declarators C++0x総復習
§8.3.2 References 右辺値参照が導入され、従来の参照は左辺値参照と呼ばれるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 56 class hoge {     std::unique_ptr<hige> p_value;   public: hoge(const hige & a) :p_value(new hige(a)) { } hoge(const hoge & a) :p_value(new hige(*a.p_value)) { } hoge(hoge&& a) {       std::swap(p_value, a.p_value);// コピーせずに奪う。     } };
§8.3.5 Functions 関数の戻り型を後置できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 57 typedef int IFUNC(int); IFUNC* fpif(int); ↑が↓のように記述できる。 autofpif(int)->int(*)(int);
§8.4.1 In general¶8 関数名を示す定義済み変数 __func__が導入されました。 関数ローカルの次ようなイメージの定義済み変数として提供されます。 組み込みマクロではなくあくまで変数として提供され、また関数名は処理系定義の文字列となります。 C++0x総復習 Boost.勉強会 #5 名古屋 58 static const char __func__[] = "function-name";
§8.4.2 Explicitly-defaulted functions クラスのコンストラクタ/デストラクタや operator のdefault 実装を明示的に要求できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 59 class hoge { public: hoge(const hoge & a)= default; }
§8.4.2 Explicitly-defaulted functions C++0x総復習 Boost.勉強会 #5 名古屋 60 外でも指定可。 class hoge { public: hoge(const hoge & a); }; hoge::hoge(const hoge & a) = default;
§8.4.3 Deleted definitions C++0x総復習 Boost.勉強会 #5 名古屋 61 クラスのコンストラクタ/デスクトラクタや operator のdefault 実装を拒否できるようになりました。 class hoge { public: hoge(const hoge & a)= delete; }
§8.5 Initializers¶15 初期化の構文中で ( ) の代わりに { } も使えるようになりました。 関連:§15.1, §15.3, §8.5.1, §12.8 C++0x総復習 Boost.勉強会 #5 名古屋 62 class hoge {   int value; public:   hoge(int a_value) :value {a_value} { } }; hoge x{1}; auto y = new hoge {1}; hoge f(int a) { return {a}; }
§8.5.4 List-initialization C++0x総復習 Boost.勉強会 #5 名古屋 63 初期化リストが導入されました。 int a = {1}; std::complex<double> z{1,2}; new std::vector<std::string>{"once", "upon", "a", "time"}; // 4 string elements f({"Nicholas","Annemarie"} ); // pass list of two elements return {"Norah" };            // return list of one element int* e {};                     // initialization to zero / null pointer x = double{1};                 // explicitly construct a double std::map<std::string,int> anim = {{"bear",4},{"cassowary",2},{"tiger",7}};
§8.5.4 List-initialization C++0x総復習 Boost.勉強会 #5 名古屋 64 コンストラクタは初期化リストを std::initilizer_list<E>型の値として受け取ることが可能です(§13.3.1.7) 。 std::initilizer_listクラステンプレートを利用するには <initializer_list> を include しておく必要があります。 初期化リスト内で narrowing conversion が発生する場合はエラーとなります。 関連:§4.13 Integer conversion rank
§9Classes C++0x総復習
§9 Classes ¶3 class を final 指定することで継承を禁止できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 66 class final hoge { ... }; class hige: hoge { ... }; // error
§9.5 Unions union がメンバー関数(コンストラクタ/デストラクタも含む)を持てるようになりました。 ただし、普通のクラスのように継承したりされたりといったことは今まで通りできません。 C++0x総復習 Boost.勉強会 #5 名古屋 67
§9.5 Unions union のメンバーにコンストラクタ/デストラクタを持つようなクラスを含ませることも可能になりました。 C++0x総復習 Boost.勉強会 #5 名古屋 68 union U {   int i;   float f;   std::string s; };
§9.5 Unions ただし、それらのコントラクタ/デストラクタは自動では呼び出されないので、適切に配置構文 new および明示的なデストラクタの呼び出しを行うことが必要になります。 C++0x総復習 Boost.勉強会 #5 名古屋 69
§9.5 Unions C++0x総復習 Boost.勉強会 #5 名古屋 70 union U {   int i;   float f;   std::string s;   U() {     new (&s) s();   }   ~U() { s.~string();   } };
§10Derived classes C++0x総復習
§10.3 Virtual functions ¶4 仮想関数に final を指定することで継承先のクラスでその仮想関数のオーバーライドを禁止できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 72 struct B {   virtual void f() const final; }; struct D : B {   void f() const; // error: D::f attempts to override final B::f };
§10.3 Virtual functions ¶5 仮想関数に override を指定することでオーバーライドであること明示できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 73 struct B {   virtual void f(int); }; struct D : B {   void f(long) override; // error: wrong signature overriding B::f   void f(int) override; // OK };
§11Member access control C++0x総復習
§11Member access control trivial な修正が多数。 C++0x総復習 Boost.勉強会 #5 名古屋 75
§12Special member functions C++0x総復習
§12.3.2 Conversion functions ¶2 変換関数にも explicit が指定できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 77 class Y { }; struct Z { explicit operator Y() const; }; void h(Z z) {   Y y1(z);     // OK: direct-initialization   Y y2 = z;    // ill-formed: copy-initialization   Y y3 = (Y)z; // OK: cast notation }
§12.6.2 Initializing bases and members 委譲コンストラクタ(delegating constructor)が導入され、コンストラクタから同じクラスの別のコンストラクタが利用できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 78
§12.6.2 Initializing bases and members C++0x総復習 Boost.勉強会 #5 名古屋 79 struct C {   C( int ) { }               // #1: non-delegating constructor   C(): C(42) { }             // #2: delegates to #1   C( char c ) : C(42.0) { }  // #3: ill-formed due to recursion with #4   C( double d ) : C('a'){ } // #4: ill-formed due to recursion with #3   C( long ) { C(42); }       // #5: not delegation, temporarily object };
§12.6.2 Initializing bases and members クラス定義内でデータメンバーの初期値を指定できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 80 struct A {   int b =42;   std::string c("truth"); A() { } };
§12.6.2 Initializing bases and members C++0x総復習 Boost.勉強会 #5 名古屋 81 struct A {   int b = std::printf("hoge");   A() { }            // std::printf("hoge")が実行され、 // その戻り値が b に格納される。 A(int x) :b(x) { } // std::printf("hoge") は実行されず、 // x が b に格納される。 };
§12.8 Copying and moving class objects 同型の右辺値参照(≒同型の一時オブジェクト)を引数とするムーブコンストラクタが定義されました。 C++0x総復習 Boost.勉強会 #5 名古屋 82
§12.8 Copying and moving class objects C++0x総復習 Boost.勉強会 #5 名古屋 83 struct Y {   Y(const Y&); Y(Y&&); }; extern Y f(int); Y d(f(1)); // calls Y(Y&&) Y e = d;   // calls Y(const Y&)
§12.9 Inheriting constructors 継承コンストラクタが導入され、継承元のコンストラクタを継承先で引き継げるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 84
§12.9 Inheriting constructors C++0x総復習 Boost.勉強会 #5 名古屋 85 struct B1 {   B1(int); }; struct D1 : B1 { using B1::B1; }; D1 x(42);
§13Overloading C++0x総復習
§13Overloading trivial な(ry C++0x総復習 Boost.勉強会 #5 名古屋 87
§14Templates C++0x総復習
§14.2 Names of template specializations クラステンプレートをネストした際の閉じ山括弧をスペースでセパレートしなくてよくなりました。 C++0x総復習 Boost.勉強会 #5 名古屋 89 template<int i> class X { /* ... */ }; template<class T> class Y { /* ... */ }; Y<X<1>> x3;      // OK, same as Y<X<1> > x3; Y<X<6>>1>> x4;   // syntax error Y<X<(6>>1)>> x5; // OK
§14.3.1 Template type arguments ローカルクラスをテンプレート引数に利用できないとする制限が削除されました。 ただし、§14.5.2 Member templates ¶2 のローカルクラスではメンバーテンプレートを持てないとする記述(A local class shall not have member template.)は残っているままなので注意。 C++0x総復習 Boost.勉強会 #5 名古屋 90
§14.3.1 Template type arguments C++0x総復習 Boost.勉強会 #5 名古屋 91 template <class T> class X { /* ... */ }; void f() {   struct S { /* ... */ };   X<S> x3;  // C++03 ではエラー X<S*> x4; // C++03 ではエラー }
§14.5.3 Variadic templates 可変長template引数が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 92 template<class ... Types> struct Tuple { }; Tuple<> t0;           // Types contains no arguments Tuple<int> t1;        // Types contains one argument: int Tuple<int, float> t2; // Types contains two arguments: int and float Tuple<0> error;       // error: 0 is not a type template<class ... Types> void f(Types ... rest); template<class ...Types> void g(Types ... rest) {   f(&rest ...); // “&rest ...” is a pack expansion; “&rest” is its pattern }
§14.5.3 Variadic templates C++0x総復習 Boost.勉強会 #5 名古屋 93 template<typename...> struct Tuple {}; template<typename T1, typename T2> struct Pair {}; template<class ...Args1> struct zip {   template<class ...Args2> struct with {     typedef Tuple<Pair<Args1, Args2> ...> type;   }; }; typedef zip<short, int>::with<unsigned short, unsigned>::type T1;     // T1 is Tuple<Pair<short, unsigned short>, Pair<int, unsigned>> typedef zip<short>::with<unsigned short, unsigned>::type T2;     // error: different number of arguments specified for Args1 and Args2 template<class ...Args>   void g(Args ...args) {                 // OK: Args is expanded by the function parameter pack args     f(const_cast<const Args*>(&args)...); // OK: “Args” and “args” are expanded     f(5 ...);                             // error: pattern does not contain any parameter packs     f(args);                              // error: parameter pack “args” is not expanded     f(h(args ...) + args ...);            // OK: first “args” expanded within h, second                                           // “args” expanded within f   }
§14.5.3 Variadic templates template引数の数の取得には sizeof … を使用する。 C++0x総復習 Boost.勉強会 #5 名古屋 94 template<class ... Types> struct Tuple {   static int size = sizeof ... (Types); };
§14.5.3 Variadic templates 可変長template引数の最初の引数を取得するといった手段は直接的には提供されていない為、必要に応じて次のようなテクニックを使う。 C++0x総復習 Boost.勉強会 #5 名古屋 95 template<class First, class ...Trail> struct GetFirst {  typedef First Type; }; template<class ... Types> struct Tuple {   typedef typename GetFirst<Types ...>::Type FirstType; };
§14.5.7 Alias templates 別名templateが導入されました。 指定には using キーワードを使用する。 別名はあくまで別名でしかない為、タイプマッチング等ではオリジナルのtemplateを直接使用したのと同じように処理されるので注意。 C++0x総復習 Boost.勉強会 #5 名古屋 96
§14.5.7 Alias templates C++0x総復習 Boost.勉強会 #5 名古屋 97 template<class T> struct Alloc { / ... / }; template<class T> usingVec = vector<T, Alloc<T>>; Vec<int> v; // same as vector<int, Alloc<int>> v; template<class T>   void process(Vec<T>& v) { / ... / } template<class T>   void process(vector<T, Alloc<T>>& w) { / ... / } // error: redefinition template<template<class> class TT> void f(TT<int>); f(v); // error: Vec not deduced template<template<class,class> class TT> void g(TT<int, Alloc<int>>); g(v); // OK: TT = vector
§14.7.2 Explicit instantiation 自動インスタンス化を防ぐ明示的インスタンス化宣言が導入されました。 参考情報: http://msdn.microsoft.com/en-us/library/by56e477.aspx( Microsoft Specific の部分が C++0x の仕様として採用されたっぽいです。 ) C++0x総復習 Boost.勉強会 #5 名古屋 98 extern template class MyStack<int, 6>;
§15Exception handling C++0x総復習
15.1 Throwing an exception throw された例外オブジェクト(のコピー)の寿命がstd::exception_ptrで参照されている場合、参照が無くなるまで延命されました。 throw できる例外オブジェクトの要件である「コピーコンストラクタを持っていてデストラクタにアクセス可能であること」が「コピーコンストラクタあるいはムーブコンストラクタを持っていてデストラクタにアクセス可能であること」に修正されました。 C++0x総復習 Boost.勉強会 #5 名古屋 100
§15.4 Exception specifications 例外仕様に例外を投げないこと明示する noexcept が追加され、従来の例外仕様は動的例外仕様と呼ばれるようになりました。 参考情報: 本の虫: ややこしいnoexcepthttp://cpplover.blogspot.com/2010/10/noexcept.html C++0x総復習 Boost.勉強会 #5 名古屋 101 void f() noexcept ; // noexcept(true)と同じ void g() noexcept(true) ; // 例外を投げない void h() noexcept(false) ; // 例外を投げる
§16Preprocessing directives C++0x総復習
§16.3 Macro replacement ¶5 可変長マクロ引数を扱う為の __VA_ARGS__が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 103 #if define(NDEBUG) #deine DEBUG_printf(...) printf(__VA_ARGS__) #else #deine DEBUG_printf(...) ((void)0) #endif
§16.8 Predefined macro names __cplusplusマクロの指し示す値が 199711L から201103L に変わります。 C++0x総復習 Boost.勉強会 #5 名古屋 104
§16.8 Predefined macro names 次の組み込みが追加されました。 __STDC_HOSTED__ __STDC_MB_MIGHT_NEQ_WC__ __STDC_VERSION__ __STDC_ISO_10646__ __STDCPP_STRICT_POINTER_SAFETY__ __STDCPP_THREADS__ C++0x総復習 Boost.勉強会 #5 名古屋 105
§16.8 Predefined macro names __STDC_HOSTED__ ホスト処理系(標準に準拠した処理系)である場合に1。そうでなければ0。 __STDC_MB_MIGHT_NEQ_WC__ 'a' == L'a' が成立しない場合に1。 __STDC_VERSION__ 処理系定義の値で、C99 に準拠している場合には 199901L となることが期待されます。 C++0x総復習 Boost.勉強会 #5 名古屋 106
§16.8 Predefined macro names __STDC_ISO_10646__ wchar_t に格納される文字コードが ISO/IEC 10646 (UNICODE) に準拠している場合に定義され、その値は準拠しているISO/IEC 10646のバージョンに合わせて yyyymmLの書式で 199712L などのように定義される。 __STDCPP_STRICT_POINTER_SAFETY__ 処理系が strict pointer safety を持つ場合に1として定義されます。(そうでない場合、処理系は relaxed pointer safety を持つ) __STDCPP_THREADS__ マルチスレッド実行が可能な場合に1として定義されます。 C++0x総復習 Boost.勉強会 #5 名古屋 107
§16.9 Pragma operator _Pragma オペレーターが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 108 #define LISTING(x) PRAGMA(listing on #x) #define PRAGMA(x) _Pragma(#x) LISTING( ..isting.dir ) // #pragma listing on "..isting.dir" と等価
§17Library introduction C++0x総復習
§17.6.4.2.2 Namespace posix C++0x総復習 Boost.勉強会 #5 名古屋 110 ISO/IEC 9945 およびその他のPOSIXの為に  namespace posixが予約されました。
§17.6.4.3.5 User-defined literal suffixes C++0x総復習 Boost.勉強会 #5 名古屋 111 アンダースコアで始まらないユーザー定義リテラルサフィックスが将来の標準の為に予約されました。 ->ユーザーコーディングでユーザー定義リテラルを使う場合、サフィックスはアンダースコアで始めること。で、且つアンダースコアで始まるグローバルな名前は§17.6.4.3.2で予約されてるので、ユーザー定義リテラルをグローバルな名前空間で使うのは禁止。(´Д`;
§18Language support library C++0x総復習
§18.2 Types 次の型が <cstddef> ヘッダーに追加されました。 std::max_align_t 処理系がサポートする最大のアライメントを持つ型 std::nullptr_t nullptr リテラルの型 C++0x総復習 Boost.勉強会 #5 名古屋 113
§18.4 Integer types <cstdint>ヘッダが導入されました。次の型がstd 名前空間で提供されます。 int8_t int16_t int32_t int64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t int_least8_t int_least16_t int_least32_t int_least64_t intmax_tintptr_t uint8_t uint16_t uint32_t uint64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t uintmax_tuintptr_t C++0x総復習 Boost.勉強会 #5 名古屋 114
§18.5 Start and termination <cstdlib> から利用できる次の関数が追加れました。 [[noreturn]] void _Exit(int status) noexcept; 各種オブジェクトのデストラクタすら呼び出さずに即プログラムを終了させる。 extern "C" int at_quick_exit(void (*f)(void)) noexcept; extern "C++" int at_quick_exit(void (*f)(void)) noexcept; quick_exit() から呼び出される関数を登録します。 処理系は少なくとも32個の関数を登録できるようにすることが推奨されます。 [[noreturn]] void quick_exit(int status) noexcept; at_quick_exit() で登録された関数を全て呼び出した後に _Exit() を呼び出します。 C++0x総復習 Boost.勉強会 #5 名古屋 115
§18.6.2.5 get_new_handler set_new_handler() でセットしたハンドラを取得できる次の関数が追加されました。 new_handlerget_new_handler() noexcept; C++0x総復習 Boost.勉強会 #5 名古屋 116
§18.7.1 Class type_info type_infoクラスに次のメンバー関数が追加されました。 size_t hash_code() const noexcept; a == b なら a.hash_code() == b.hash_code() で a != b なら a.hash_code() != b.hash_code() な値を返します。 C++0x総復習 Boost.勉強会 #5 名古屋 117
§18.8 Exception handling <exception>ヘッダに次のクラスとそれに関連する関数が追加されました。 exception_ptrクラス nested_exceptionクラス C++0x総復習 Boost.勉強会 #5 名古屋 118
§18.8 Exception handling exception_ptr クラス 例外オブジェクトに対するスマートポインタで、catch 句を抜けた後でもこのexception_ptrにより例外オブジェクトを保持できます。 exception_ptrに関連する関数 exception_ptrcurrent_exception() noexcept; 現在 throw されてる例外オブジェクトを保持する exception_ptrを取得する。 [[noreturn]] void rethrow_exception(exception_ptr p); 引数で渡された exception_ptrが保持している例外オブジェクトを再送出する。 template<class E> exception_ptrmake_exception_ptr(E e) noexcept; 引数で渡されたオブジェクトを保持する exception_ptrを返す。 エラーハンドリング Boost.勉強会 #3 関西 119
nested_exceptionクラス ネストされた例外オブジェクト メンバー関数抜粋 [[noreturn]] void rethrow_nested() const; ネストの内側の例外オブジェクトを再送出。 exception_ptrnested_ptr() const noexcept; ネストの内側の例外オブジェクトを保持する exception_ptrを返す。 nested_exceptionクラスに関連する関数 [[noreturn]] template <class T> void throw_with_nested(T&& t); 引数で渡されたオブジェクトがnested_exceptionを継承している場合はそのまま、されていない場合は元の型とnested_exceptionの両方を継承している型で例外を送出する。 template <class E> void rethrow_if_nested(const E& e); 引数で渡されたオブジェクトがpublicにnested_exceptionを継承している場合にのみそのrethrow_nested()を呼び出します。 エラーハンドリング Boost.勉強会 #3 関西 120
§18.8 Exception handling set_unexpected() のget側である次の関数も追加されました。 terminate_handlerget_terminate() noexcept; C++0x総復習 Boost.勉強会 #5 名古屋 121
§18.9 Initializer lists std::initializer_listクラステンンプレートが定義されている <initializer_list>ヘッダが追加されました。 C++0x総復習 Boost.勉強会 #5 名古屋 122
§18.9 Initializer lists C++0x総復習 Boost.勉強会 #5 名古屋 123 namespace std {   template<class E> class initializer_list {   public:     typedef E value_type;     typedef const E& reference;     typedef const E& const_reference;     typedef size_t size_type;     typedef const E* iterator;     typedef const E* const_iterator;     initializer_list() noexcept;     size_t size() const noexcept; // number of elements     const E* begin() const noexcept; // first element     const E* end() const noexcept; // one past the last element   }; // 18.9.3 initializer list range access   template<class E> const E* begin(initializer_list<E> il) noexcept;   template<class E> const E* end(initializer_list<E> il) noexcept; }
§19Diagnostics library C++0x総復習
§19.4 Error numbers <cerrno>ヘッダで定義される変数が大幅に増えました。 ECONNREFUSED E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED EIO ECONNRESET EDEADLK EDESTADDRREQ EDOM EEXIST EFAULT EFBIG EHOSTUNREACH EIDRM EILSEQ EINPROGRESS EINTR EINVAL ENODEV EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODATA ENOTEMPTY ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG ENOPROTOOPT ENOSPC ENOSR ENOSTR ENOSYS ENOTCONN ENOTDIR ERANGE ENOTRECOVERABLE ENOTSOCK ENOTSUP ENOTTY ENXIO EOPNOTSUPP EOVERFLOW EOWNERDEAD EPERM EPIPE EPROTO EPROTONOSUPPORT EPROTOTYPE EROFS ESPIPE ESRCH ETIME ETIMEDOUT ETXTBSY EWOULDBLOCK EXDEVerrno C++0x総復習 Boost.勉強会 #5 名古屋 125
§19.5 System error support OSあるいはその他基本ソフトウェアのネイティブのエラーコードをサポートするためのライブラリが導入されました。ヘッダは<system_error>。 C++0x総復習 Boost.勉強会 #5 名古屋 126
§19.5 System error support C++0x総復習 Boost.勉強会 #5 名古屋 127 namespace std {   class error_category;   class error_code;   class error_condition;   class system_error;   template <class T>   struct is_error_code_enum : public false_type {};   template <class T>   struct is_error_condition_enum : public false_type {};   enum class errc {     ...   };   template <> struct is_error_condition_enum<errc> : true_type { }   error_code make_error_code(errc e) noexcept;   error_condition make_error_condition(errc e) noexcept;   // 19.5.4 Comparison operators: ... } // namespace std
§20General utilities library C++0x総復習
§20.7 Smart pointers <memory>ヘッダに次のスマートポインタが導入されました。 unique_ptr(§20.7.1) auto_ptrの改善版。 shared_ptr(§20.7.2.2) 所有を共有するスマートポインタ。 weak_ptr(§20.7.2.3) 循環参照問題を回避する為のスマートポインタ。 C++0x総復習 Boost.勉強会 #5 名古屋 129
§20General utilities library 他にも tuple だの ratio だの chronoだのいろいろ追加されます。 C++0x総復習 Boost.勉強会 #5 名古屋 130
§21Strings library C++0x総復習
§21 Strings library char16_t, char32_t に合わせて、 u16string, u32string 等々が追加されいます。 C++0x総復習 Boost.勉強会 #5 名古屋 132
§22Localization library C++0x総復習
§22.5 Standard code conversion facets 文字エンコーディング変換の為の <codecvt>ヘッダが追加されています。 ->あんまり期待はできなさそう。 C++0x総復習 Boost.勉強会 #5 名古屋 134
§23Containers library  C++0x総復習
§23Containers library 新たなコンテナおよび同名の次のヘッダが追加されました。 <array> <forward_list> <unordered_map> <unordered_set> C++0x総復習 Boost.勉強会 #5 名古屋 136
§24Iterators library C++0x総復習
ここはみんなで埋めてね! C++0x総復習 Boost.勉強会 #5 名古屋 138
§25Algorithms library C++0x総復習
§25Algorithms library all_of(§25.2.1), any_of(§25.2.2), none_of(§25.2.3), is_permutation(§25.2.12), move(§25.3.2) が追加されました。 C++0x総復習 Boost.勉強会 #5 名古屋 140
§26Numerics library C++0x総復習
§26.5 Random number generation 乱数まわりが大幅に強化されました。 C++0x総復習 Boost.勉強会 #5 名古屋 142
§27Input/output library C++0x総復習
ここはみんなで埋めてね! C++0x総復習 Boost.勉強会 #5 名古屋 144
§28Regular expressions library C++0x総復習
§28Regular expressions library 正規表現ライブラリが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 146
§29Atomic operations library C++0x総復習
§29Atomic operations library Atomic操作ライブラリが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 148
§30libraryThread support C++0x総復習
§30libraryThread support スレッドをサポートするライブラリが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 150
Annex A Grammar summary C++0x総復習
Annex A Grammar summary 文法の仕様変更に合わせてこの要約も修正されているだけなので特筆事項はなし。 C++0x総復習 Boost.勉強会 #5 名古屋 152
Annex B Implementation quantities C++0x総復習
Annex B (informative) Implementation quantities 次の最小の推奨値について追加・修正されました。 at_quick_exit() で登録できる関数 (32) constexpr 関数の再帰呼び出し(512) 入れ子templateの再帰的インスタンス化(17->1024) プレースホルダの数(10) C++0x総復習 Boost.勉強会 #5 名古屋 154
Annex C Compatibility C++0x総復習
Annex C Compatibility 重要な互換性に関する情報がしれっと沢山明記されています。 規格書の性質上旧バージョンとの差異については本体部分には直接的に明記されない為、ここで補完されています。 C++0x総復習 Boost.勉強会 #5 名古屋 156
Annex C Compatibility §C.1 C++ and ISO C はC言語との差分の話だから読み飛ばして、C++03 との差分をチェックしようと§C.2 C++ and ISO C++ 2003 をしっかり読もうかと思ったら、ここにも落とし穴があって、内容的に§C.1 と被る内容は§C.2には記述されていないので§C.1も読む必要があります! C++0x総復習 Boost.勉強会 #5 名古屋 157
Annex C Compatibility 具体的に書かれている内容をピックアップすると… char * str = "invalid!";が invalid に!( §C.1.1 Clause 2: lexical conventions ) 整数に対する / および % の演算結果が負の値の場合でもゼロに近いほうへ丸めることに!( §C.2.2 Clause 5: expressions ) 記憶域種別指定子としての auto が削除されたってのも直接的な明記があるのはここ。( §C.2.3 Clause 7: declarations ) 禁止されたマクロ名に override, final, carries_dependency, noreturn を追加。( §C.2.7 Clause 17: library introduction ) C++0x総復習 Boost.勉強会 #5 名古屋 158
Annex D Compatibility features C++0x総復習
Annex D Compatibility features 新たに deprecated になったもの。 記憶域種別指定子としての register ユーザー定義のコピー代入operatorあるいはユーザー定義のデストラクタを持つクラスの暗黙的に作成されるコピーコンストラクタ 動的例外仕様 unary_functionおよび binary_functionクラステンプレート ptr_fun, mem_fun, mem_fun_refアダプタ binder1st, bind1st, binder2nd, bind2nd バインダ unexpected_handlerまわり 動的例外仕様が deprecated なので。 auto_ptr 代わりに unique_ptrを推奨 C++0x総復習 Boost.勉強会 #5 名古屋 160
Annex E Universal character names for identifier characters C++0x総復習
Annex E Universal character names for identifier characters ユニバーサルキャラクタ名として許可されている文字範囲から文字種の表記が消えました。 ユニバーサルキャラクタ名として禁止されている文字範囲の記述が増えました。 C++0x総復習 Boost.勉強会 #5 名古屋 162
Annex f Cross references C++0x総復習
Annex f Cross references クロスリファレンスが追加されました。 C++0x総復習 Boost.勉強会 #5 名古屋 164
補足情報 C++0x総復習
規格 ISO/IEC 14882 C++ の国際規格。初版は ISO/IEC 14882:1998 で、現行版は ISO/IEC 14882:2003 。 JIS X 3014 C++ のJIS規格で ISO/IEC 14882 の邦訳版。現在は JIS X 3014:2003 のみ。 C++0x総復習 Boost.勉強会 #5 名古屋 166
規格 FDIS Final Draft International Standard の略で、各国の投票により可決されれば、typo などの修正を除き原則的にほぼそのままIS(国際規格)となる。 C言語の規格 ISO/IEC 9899 JIS X 3010 C++0x総復習 Boost.勉強会 #5 名古屋 167
C++の呼称 C++03 ISO/IEC 14882:2003 のC++のこと。 C++0x C++03 の次の C++ のこと。200X年にリリースされる次期C++としてそう呼ばれていたが実際には201X年にもつれ込んだ。既にさらに次のC++1xの名称が使われ出していたこともあり、混乱を避ける為にC++0xのまま通すことになった。 C++1x C++0x の次の C++ のこと。201X年にリリースされる予定。 C++0x総復習 Boost.勉強会 #5 名古屋 168
参考情報 C++ Glossaryhttp://www.kmonos.net/alang/cpp/glossary.html( C++関連の各種略語の解説があります。 ) C++0xの言語拡張まとめ(※随時更新)http://d.hatena.ne.jp/faith_and_brave/20071022/1193052163 C++0x - Wikipediahttp://ja.wikipedia.org/wiki/C%2B%2B0x( C++0xで導入される各種機能の解説があります。 ) C++0x - the next ISO C++ standard (英語)http://www2.research.att.com/~bs/C++0xFAQ.html C++0x総復習 Boost.勉強会 #5 名古屋 169
書籍 本の虫(http://cpplover.blogspot.com/ )で、有名なC++標準化委員会WGのエキスパートメンバーでもある江添さんがC++0x本を現在執筆中ですので、出版されたら是非ともゲットしましょう! C++0x総復習 Boost.勉強会 #5 名古屋 170

Mais conteúdo relacionado

Mais procurados

競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C++入門?
C++入門?C++入門?
C++入門?tsudaa
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 

Mais procurados (20)

競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
C++入門?
C++入門?C++入門?
C++入門?
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
More C++11
More C++11More C++11
More C++11
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
Map
MapMap
Map
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
C++11
C++11C++11
C++11
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 

Destaque

LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介道化師 堂華
 
独りガラパゴス開発
独りガラパゴス開発独りガラパゴス開発
独りガラパゴス開発道化師 堂華
 
エラーハンドリングモデル考察
エラーハンドリングモデル考察エラーハンドリングモデル考察
エラーハンドリングモデル考察道化師 堂華
 
ふり返りハック ~ ライフをハッキングするために
ふり返りハック ~ ライフをハッキングするためにふり返りハック ~ ライフをハッキングするために
ふり返りハック ~ ライフをハッキングするために虹 父
 
マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512tosch0718
 
20161026_超高層大気観測データのメタデータ作成実験経過報告
20161026_超高層大気観測データのメタデータ作成実験経過報告20161026_超高層大気観測データのメタデータ作成実験経過報告
20161026_超高層大気観測データのメタデータ作成実験経過報告Yasuyuki Minamiyama
 
ユーザ目線の実践的BPM
ユーザ目線の実践的BPMユーザ目線の実践的BPM
ユーザ目線の実践的BPMShigeaki Wakizaka
 
名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン
名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン
名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼンhiroyuki Yamamoto
 
社内Gtd勉強会 20101022
社内Gtd勉強会 20101022社内Gtd勉強会 20101022
社内Gtd勉強会 20101022tosch0718
 
GTD 残業を減らす方法
GTD 残業を減らす方法GTD 残業を減らす方法
GTD 残業を減らす方法Gaddict
 
TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~Shuhei Hinoshita
 
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」Marika UCHIDA
 
Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明T T
 
関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラントRikie Ishii
 

Destaque (20)

バグベアード入門
バグベアード入門バグベアード入門
バグベアード入門
 
LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介
 
独りガラパゴス開発
独りガラパゴス開発独りガラパゴス開発
独りガラパゴス開発
 
エラーハンドリングモデル考察
エラーハンドリングモデル考察エラーハンドリングモデル考察
エラーハンドリングモデル考察
 
Doc and Error Handling
Doc and Error HandlingDoc and Error Handling
Doc and Error Handling
 
ふり返りハック ~ ライフをハッキングするために
ふり返りハック ~ ライフをハッキングするためにふり返りハック ~ ライフをハッキングするために
ふり返りハック ~ ライフをハッキングするために
 
Unix2
Unix2Unix2
Unix2
 
マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512マインドハック研究会 ライフハック編 20100512
マインドハック研究会 ライフハック編 20100512
 
20161026_超高層大気観測データのメタデータ作成実験経過報告
20161026_超高層大気観測データのメタデータ作成実験経過報告20161026_超高層大気観測データのメタデータ作成実験経過報告
20161026_超高層大気観測データのメタデータ作成実験経過報告
 
ユーザ目線の実践的BPM
ユーザ目線の実践的BPMユーザ目線の実践的BPM
ユーザ目線の実践的BPM
 
名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン
名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン
名古屋アジャイル勉強会トヨタ生産方式に学ぶカイゼン
 
社内Gtd勉強会 20101022
社内Gtd勉強会 20101022社内Gtd勉強会 20101022
社内Gtd勉強会 20101022
 
GTD 残業を減らす方法
GTD 残業を減らす方法GTD 残業を減らす方法
GTD 残業を減らす方法
 
TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~TO LOVE IN'~人生のパートナーを見つける旅~
TO LOVE IN'~人生のパートナーを見つける旅~
 
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
 
バージョン管理入門
バージョン管理入門バージョン管理入門
バージョン管理入門
 
Unix1
Unix1Unix1
Unix1
 
Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明
 
X hago3
X hago3X hago3
X hago3
 
関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント
 

Semelhante a C++0x総復習

.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)Akira Takahashi
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
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++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Takaaki Suzuki
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 

Semelhante a C++0x総復習 (20)

.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
C++の復習
C++の復習C++の復習
C++の復習
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
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# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Último (8)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

C++0x総復習

  • 2. C++0x総復習 Boost.勉強会 #5 名古屋 (2011-05-14 )
  • 5. C++0xの最新かつ最期の復習 細かな typo の修正等を除けば原則的に正式版とほぼ同一内容(※)となるFDIS(N3290)をベースにC++0xをおさらいしましょう! C++0x総復習 Boost.勉強会 #5 名古屋 5
  • 8. §1.10 Multi-threaded executions and data races マルチスレッド実行が言語仕様上、意識されるようになり、マルチスレッドで動作する際の挙動が定義されました。 参考情報: C++0x Memory Model 第0回 - メモリモデルとは何かhttp://d.hatena.ne.jp/Cryolite/20101226#p1 C++0x Memory Model 第1回 - 1.9 Program executionhttp://d.hatena.ne.jp/Cryolite/20101228#p1 C++0x総復習 Boost.勉強会 #5 名古屋 8
  • 10. §2.3 Character sets ユニバーサルキャラクタ名の制限緩和 C++0x総復習 Boost.勉強会 #5 名古屋 10 const char16_t * str16 = u"905353165E2B"; // 道化師 const char32_t * str32 = U"000090530000531600005E2B"; // 道化師
  • 11. §2.11 Identifiers 処理系定義の文字を識別子として使うことが許されるようになりました。 これにより処理系によっては日本語識別子が使えるようになります。 C++0x総復習 Boost.勉強会 #5 名古屋 11
  • 12. §2.11 Identifiers 特別な意味を持つ識別子が予約されました。 override オーバーライド関数であることの明示。 final [クラスの継承禁止]および[関数のオーバーライド禁止]。 ※特別な識別子であって予約語ではない点に注意。 C++0x総復習 Boost.勉強会 #5 名古屋 12
  • 13. §2.12 Keywords 予約語が増えました。 予約語一覧(橙色が新しい予約語) alignasalignof asm auto bool break case catch char char16_tchar32_t class const const_cast constexpr continue decltype default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new noexceptnullptr operator private protected public register reinterpret_cast return short signed sizeof static static_assert static_cast struct switch template this thread_local throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while C++0x総復習 Boost.勉強会 #5 名古屋 13
  • 14. §2.12 Keywords alignas アライメントの指定 alignof アライメントの取得 char16_t UNICODE(UTF-16)用の文字型 char32_t UNICODE(UTF-32)用の文字型 constexpr 定数式 C++0x総復習 Boost.勉強会 #5 名古屋 14
  • 15. §2.12 Keywords decltype 式から型を取得/指定 noexcept 例外送出しないことの明示(指定)と判定(operator) nullptr ナルポインタリテラル static_assert コンパイル時assert thread_local スレッドローカルストレージ C++0x総復習 Boost.勉強会 #5 名古屋 15
  • 16. §2.14 Literals 追加されたサフィックスとプレフィックス long long 型用の LLサフィックス cha16_t 型用の uプレフィックス cha32_t 型用の Uプレフィックス UTF-8な文字列用の u8プレフィックス cha16_t 型な文字列用の uプレフィックス cha32_t 型な文字列用の Uプレフィックス raw 文字列用の Rプレフィックス C++0x総復習 Boost.勉強会 #5 名古屋 16
  • 17. §2.14.5 String literals raw文字列リテラル C++0x総復習 Boost.勉強会 #5 名古屋 17 const char *p = R"(abr />b c)"; // == "abc" R"a( )br />a" )a" // == ")aquot;" R"(??)" // == ""
  • 18. §2.14.5 String literals raw文字列リテラル 詳細なかなり珍妙な仕様になっているので要注意。 初期の提案では ( ) でなく [ ] が使われることになっていた為、Web上の多くのraw文字列リテラルに関する情報は[ ]のままになっているので注意。 参考情報: http://d.hatena.ne.jp/haru-s/20081205 C++0x総復習 Boost.勉強会 #5 名古屋 18
  • 19. §2.14.5 String literals 型の異なる文字列リテラルのコンパイル時の結合規則が定義されました。 片方にエンコーディングプレフィックスがついていない場合、もう片方のエンコーディングプレフィックスに従う。 UTF-8文字列リテラルがワイド文字列リテラルと結合するのは不適格。 それ以外の組み合わせは処理系依存。 C++0x総復習 Boost.勉強会 #5 名古屋 19
  • 20. §2.14.7 Pointer literals ポインタリテラル std::nullptr_t 型の nullptr 今後は NULL より nullptrを使いましょう! C++0x総復習 Boost.勉強会 #5 名古屋 20
  • 21. §2.14.8 User-Defined literals ユーザー定義リテラル C++0x総復習 Boost.勉強会 #5 名古屋 21 long double operator ""_w(long double); std::string operator ""_w(const char16_t*, size_t); unsigned operator ""_w(const char*); int main() { 1.2_w; // calls operator "" _w(1.2L) u"one"_w; // calls operator "" _w(u"one", 3) 12_w; // calls operator "" _w("12") "two"_w; // error: no applicable literal operator }
  • 22. §2.14.8 User-Defined literals ユーザー定義リテラル 日時リテラル、位置情報リテラル、2進整数リテラル等々、自由にリテラルをユーザー定義できます。 …constexpr で十分じゃないか!という声もありますがw C++0x総復習 Boost.勉強会 #5 名古屋 22
  • 24. §3.9.1 Fundamental types 最大の整数型として long long int型が導入されました。 例によって規格上は最大の整数型としか定義されておらず何バイト(何ビット)の値なのかは処理系定義となります。 short intや long intと同様に signed/unsigned 修飾したり int を省略したりできます。 C++0x総復習 Boost.勉強会 #5 名古屋 24
  • 25. §3.10 Lvalues and rvalues 右辺値/左辺値の定義がより詳細になりました。 C++0x総復習 Boost.勉強会 #5 名古屋 25 式 expression ※便宜上の訳語で正式な訳語でも一般的な訳語でもありません。 汎左辺値※ glvalue 右辺値 rvalue 左辺値 lvalue 純右辺値※ prvalue 末期値※ xvalue
  • 26. §3.10 Lvalues and rvalues 左辺値 lvalue ( “left-hand” value ) 関数あるいはオブジェクト。 末期値 xvalue ( “eXpiring” value ) 生存期間の終了するオブジェクトの参照。 右辺値参照の結果。 汎左辺値 glvalue ( “generalized” lvalue ) 左辺値(lvalue)あるいは末期値(xvalue)。 右辺値 rvalue ( “right-hand” value ) 末期値(xvalue)、一時オブジェクトあるいはそのサブオブジェクト、オブジェクトに関連づいていない値。 純右辺値 prvalue ( “pure” rvalue ) 末期値(xvalue)でない右辺値(rvalue)。 C++0x総復習 Boost.勉強会 #5 名古屋 26
  • 27. §3.11 Alignment アライメントがより詳細に定義されました。 処理系がサポートする最大のアライメント: alignof(std::max_align_t) アライメントは std::size_t 型の値で示される。 C++0x総復習 Boost.勉強会 #5 名古屋 27
  • 29. §4Standard conversions 主に右辺値/左辺値、char16_t/char32_t、std::nullptr_t、unscoped enumeration 型に関連した trivial な修正。 std::nullptr_t 型の値をboolに変換した場合はfalseになる。(§4.12) Integer conversion rankの定義(§4.13) C++0x総復習 Boost.勉強会 #5 名古屋 29
  • 31. §5.1.2 Lambda expressions ラムダ式が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 31 #include <algorithm> #include <cmath> void abssort(float *x, unsigned N) { std::sort(x, x + N, [](float a, float b) { return std::abs(a) < std::abs(b); }); }
  • 32. §5.1.2 Lambda expressions C++0x総復習 Boost.勉強会 #5 名古屋 32 int a = 42; auto b = [a](){ return a; }; // b 内の a はコピー auto c = [=](){ return a; }; // b と等価 int d = b(); // -> 42 int e = [a](int x){ return a +x; }(d); // そのまま呼び出し auto f = [&a](){ return a; }; // b と違い f 内の a は参照 auto g = [&](){ return a; }; // f と等価 a = 24; int h = b(); // -> 42 int i = f(); // -> 24 auto j = [a,&d](int x){ return a +d +x; }; auto k = [=,&d](int x){return a +d +x; }; // j と等価 auto l = [&]()->int{return a; }; // g と等価(戻り型の明示)
  • 33. §5.3.6 Alignof 型からアライメントを取得できる alignof が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 33 std::size_t int_alignment = alignof(int);
  • 34. §5.3.7 noexcept operator 式が例外を送出し得るかどうかを取得できる noexcept operator が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 34 bool is_noexcept_expr = noexcept(a.swap(b));
  • 35. §5.19 Constant expressions constexpr が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 35 constexpr const int* addr(const int& ir) { return &ir; } // OK static const int x = 5; constexpr const int* xp = addr(x); // OK: (const int*)&(const int&)x is an // address constant expression constexpr const int* tp = addr(5); // error, initializer for constexpr variable not a constant // expression; (const int*)&(const int&)5 is not a constant // expression because it takes the address of a temporary
  • 36. §5.19 Constant expressions C++0x総復習 Boost.勉強会 #5 名古屋 36 int x; // not constant struct A { constexpr A(bool b) : m(b?42:x) { } int m; }; constexpr int v = A(true).m; // OK: constructor call initializes // m with the value 42 after substitution constexpr int w = A(false).m; // error: initializer for m is // x, which is non-constant
  • 38. §6.5.4 The range-based for statement 範囲ベースfor文が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 38 int array[5] = { 1, 2, 3, 4, 5 }; for(int& x : array) x *= 2;
  • 39. §6.7 Declaration statement ¶4 マルチスレッド実行時のグローバル変数およびstatic変数の初期化ルールが定義され、ユーザーコーディングによる初期化の排他処理は不要になりました。 C++0x総復習 Boost.勉強会 #5 名古屋 39
  • 41. §7 Declarations¶4 static_assert が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 41 static_assert(sizeof(long) >= 8, "64-bit code generation required for this library.");
  • 42. §7.1.1 Storage class specifiers 記憶域種別指定子としての autoが削除されました。 型推論の機能として使う為。 概念としての§3.7.3 Automatic storage duration が無くなったわけではないので注意。 C++0x総復習 Boost.勉強会 #5 名古屋 42
  • 43. §7.1.1 Storage class specifiers 記憶域種別指定子としての thread_localが導入されました。 この記憶域種が指定された変数はスレッドローカルストレージに格納される値となり、スレッド別に固有の値を持つことができます。 C++0x総復習 Boost.勉強会 #5 名古屋 43
  • 44. §7.1.6.2 Simple type specifiers 式から型を指定できるdecltypeが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 44 const int&& foo(); int i; struct A { double x; }; const A* a = new A(); decltype(foo()) x1 = i; // type is const int&& decltype(i) x2; // type is int decltype(a->x) x3; // type is double decltype((a->x)) x4 = x3; // type is const double&
  • 45. §7.1.6.4 auto specifier 型を推論してくれるauto型識別子が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 45 auto x = 5; // OK: x has type int const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int static auto y = 0.0; // OK: y has type double auto int r; // error: auto is not a storage-class-specifier
  • 46. §7.2 Enumeration declarations 正式に最後の列挙子の末尾にカンマをつけてもいいことになりました。 C++03の規格上は許されてなかったようです。 C++0x総復習 Boost.勉強会 #5 名古屋 46 enum number { zero, one, two, // ←このカンマ };
  • 47. §7.2 Enumeration declarations scoped enumeration が導入され従来の enum は unscoped enumeration と呼ばれるようになりました。 名前の通り、 scoped enumeration はスコープを持ち列挙子はそのscoped enumeration 型のスコープに所属し、名前空間を汚しません。 int 固定だった enum の内部表現型に任意の整数型を指定できるようになりました。 enum先行宣言ができるようになりました。 この場合、内部表現型の指定は必須となる。 C++0x総復習 Boost.勉強会 #5 名古屋 47
  • 48. §7.2 Enumeration declarations C++0x総復習 Boost.勉強会 #5 名古屋 48 // unscoped enumeration enum color { red, yellow, green=20, blue }; // scoped enumeration enumclassscoped_color { red, yellow, green=20, blue }; // opaque-enum-declaration enumcolor_byte:unsigned char; // base type is unsigned char enumcolor_byte:unsigned char { red, yellow, green=20, blue };
  • 49. §7.2 Enumeration declarations scoped enumerationの値と整数値は比較できません。 scoped enumeration の値を整数型の変数に代入することは可能です。 scoped enumeration の変数に整数値を代入することできません。 異なる scoped enumeration 型の値を比較、代入等をすることはできません。 C++0x総復習 Boost.勉強会 #5 名古屋 49
  • 50. §7.3.1 Namespace definition inline namespace が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 50 namespace a { inline namespace b { int c; } } int d = a::b::c; int e = a::c;
  • 51. §7.6 Attributes 属性が導入されました。 alignas noreturn carries_dependency 他処理系定義 C++0x総復習 Boost.勉強会 #5 名古屋 51
  • 52. §7.6.2 Alignment specifier alignas アライメントの指定。 指定はバイト数あるいは型名で行う。 これだけ他の属性とは別格で [[ ]] で囲まない。 C++0x総復習 Boost.勉強会 #5 名古屋 52 alignas(4) unsigned char p[sizeof(void*)]; alignas(double) unsigned char c[sizeof(double)]; // array of characters, suitably aligned for a double
  • 53. §7.6.3 Noreturn attribute noreturn 関数が絶対にreturn しないことの明示。 コンパイラの最適化を助ける為の指定。 C++0x総復習 Boost.勉強会 #5 名古屋 53 [[ noreturn ]] void f() { throw "error"; // OK }
  • 54. §7.6.4 Carries dependency attribute carries_dependency 依存を関数の内外へ伝播させる指定。 Data-Dependency Orderingを利用する場合などに使う。 参考情報: C++0x時代の Double-Checked Lockinghttp://d.hatena.ne.jp/bsdhouse/20100128/1264693781 C++0x総復習 Boost.勉強会 #5 名古屋 54
  • 56. §8.3.2 References 右辺値参照が導入され、従来の参照は左辺値参照と呼ばれるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 56 class hoge { std::unique_ptr<hige> p_value; public: hoge(const hige & a) :p_value(new hige(a)) { } hoge(const hoge & a) :p_value(new hige(*a.p_value)) { } hoge(hoge&& a) { std::swap(p_value, a.p_value);// コピーせずに奪う。 } };
  • 57. §8.3.5 Functions 関数の戻り型を後置できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 57 typedef int IFUNC(int); IFUNC* fpif(int); ↑が↓のように記述できる。 autofpif(int)->int(*)(int);
  • 58. §8.4.1 In general¶8 関数名を示す定義済み変数 __func__が導入されました。 関数ローカルの次ようなイメージの定義済み変数として提供されます。 組み込みマクロではなくあくまで変数として提供され、また関数名は処理系定義の文字列となります。 C++0x総復習 Boost.勉強会 #5 名古屋 58 static const char __func__[] = "function-name";
  • 59. §8.4.2 Explicitly-defaulted functions クラスのコンストラクタ/デストラクタや operator のdefault 実装を明示的に要求できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 59 class hoge { public: hoge(const hoge & a)= default; }
  • 60. §8.4.2 Explicitly-defaulted functions C++0x総復習 Boost.勉強会 #5 名古屋 60 外でも指定可。 class hoge { public: hoge(const hoge & a); }; hoge::hoge(const hoge & a) = default;
  • 61. §8.4.3 Deleted definitions C++0x総復習 Boost.勉強会 #5 名古屋 61 クラスのコンストラクタ/デスクトラクタや operator のdefault 実装を拒否できるようになりました。 class hoge { public: hoge(const hoge & a)= delete; }
  • 62. §8.5 Initializers¶15 初期化の構文中で ( ) の代わりに { } も使えるようになりました。 関連:§15.1, §15.3, §8.5.1, §12.8 C++0x総復習 Boost.勉強会 #5 名古屋 62 class hoge { int value; public: hoge(int a_value) :value {a_value} { } }; hoge x{1}; auto y = new hoge {1}; hoge f(int a) { return {a}; }
  • 63. §8.5.4 List-initialization C++0x総復習 Boost.勉強会 #5 名古屋 63 初期化リストが導入されました。 int a = {1}; std::complex<double> z{1,2}; new std::vector<std::string>{"once", "upon", "a", "time"}; // 4 string elements f({"Nicholas","Annemarie"} ); // pass list of two elements return {"Norah" }; // return list of one element int* e {}; // initialization to zero / null pointer x = double{1}; // explicitly construct a double std::map<std::string,int> anim = {{"bear",4},{"cassowary",2},{"tiger",7}};
  • 64. §8.5.4 List-initialization C++0x総復習 Boost.勉強会 #5 名古屋 64 コンストラクタは初期化リストを std::initilizer_list<E>型の値として受け取ることが可能です(§13.3.1.7) 。 std::initilizer_listクラステンプレートを利用するには <initializer_list> を include しておく必要があります。 初期化リスト内で narrowing conversion が発生する場合はエラーとなります。 関連:§4.13 Integer conversion rank
  • 66. §9 Classes ¶3 class を final 指定することで継承を禁止できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 66 class final hoge { ... }; class hige: hoge { ... }; // error
  • 67. §9.5 Unions union がメンバー関数(コンストラクタ/デストラクタも含む)を持てるようになりました。 ただし、普通のクラスのように継承したりされたりといったことは今まで通りできません。 C++0x総復習 Boost.勉強会 #5 名古屋 67
  • 68. §9.5 Unions union のメンバーにコンストラクタ/デストラクタを持つようなクラスを含ませることも可能になりました。 C++0x総復習 Boost.勉強会 #5 名古屋 68 union U { int i; float f; std::string s; };
  • 69. §9.5 Unions ただし、それらのコントラクタ/デストラクタは自動では呼び出されないので、適切に配置構文 new および明示的なデストラクタの呼び出しを行うことが必要になります。 C++0x総復習 Boost.勉強会 #5 名古屋 69
  • 70. §9.5 Unions C++0x総復習 Boost.勉強会 #5 名古屋 70 union U { int i; float f; std::string s; U() { new (&s) s(); } ~U() { s.~string(); } };
  • 72. §10.3 Virtual functions ¶4 仮想関数に final を指定することで継承先のクラスでその仮想関数のオーバーライドを禁止できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 72 struct B { virtual void f() const final; }; struct D : B { void f() const; // error: D::f attempts to override final B::f };
  • 73. §10.3 Virtual functions ¶5 仮想関数に override を指定することでオーバーライドであること明示できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 73 struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK };
  • 74. §11Member access control C++0x総復習
  • 75. §11Member access control trivial な修正が多数。 C++0x総復習 Boost.勉強会 #5 名古屋 75
  • 77. §12.3.2 Conversion functions ¶2 変換関数にも explicit が指定できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 77 class Y { }; struct Z { explicit operator Y() const; }; void h(Z z) { Y y1(z); // OK: direct-initialization Y y2 = z; // ill-formed: copy-initialization Y y3 = (Y)z; // OK: cast notation }
  • 78. §12.6.2 Initializing bases and members 委譲コンストラクタ(delegating constructor)が導入され、コンストラクタから同じクラスの別のコンストラクタが利用できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 78
  • 79. §12.6.2 Initializing bases and members C++0x総復習 Boost.勉強会 #5 名古屋 79 struct C { C( int ) { } // #1: non-delegating constructor C(): C(42) { } // #2: delegates to #1 C( char c ) : C(42.0) { } // #3: ill-formed due to recursion with #4 C( double d ) : C('a'){ } // #4: ill-formed due to recursion with #3 C( long ) { C(42); } // #5: not delegation, temporarily object };
  • 80. §12.6.2 Initializing bases and members クラス定義内でデータメンバーの初期値を指定できるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 80 struct A { int b =42; std::string c("truth"); A() { } };
  • 81. §12.6.2 Initializing bases and members C++0x総復習 Boost.勉強会 #5 名古屋 81 struct A { int b = std::printf("hoge"); A() { } // std::printf("hoge")が実行され、 // その戻り値が b に格納される。 A(int x) :b(x) { } // std::printf("hoge") は実行されず、 // x が b に格納される。 };
  • 82. §12.8 Copying and moving class objects 同型の右辺値参照(≒同型の一時オブジェクト)を引数とするムーブコンストラクタが定義されました。 C++0x総復習 Boost.勉強会 #5 名古屋 82
  • 83. §12.8 Copying and moving class objects C++0x総復習 Boost.勉強会 #5 名古屋 83 struct Y { Y(const Y&); Y(Y&&); }; extern Y f(int); Y d(f(1)); // calls Y(Y&&) Y e = d; // calls Y(const Y&)
  • 84. §12.9 Inheriting constructors 継承コンストラクタが導入され、継承元のコンストラクタを継承先で引き継げるようになりました。 C++0x総復習 Boost.勉強会 #5 名古屋 84
  • 85. §12.9 Inheriting constructors C++0x総復習 Boost.勉強会 #5 名古屋 85 struct B1 { B1(int); }; struct D1 : B1 { using B1::B1; }; D1 x(42);
  • 87. §13Overloading trivial な(ry C++0x総復習 Boost.勉強会 #5 名古屋 87
  • 89. §14.2 Names of template specializations クラステンプレートをネストした際の閉じ山括弧をスペースでセパレートしなくてよくなりました。 C++0x総復習 Boost.勉強会 #5 名古屋 89 template<int i> class X { /* ... */ }; template<class T> class Y { /* ... */ }; Y<X<1>> x3; // OK, same as Y<X<1> > x3; Y<X<6>>1>> x4; // syntax error Y<X<(6>>1)>> x5; // OK
  • 90. §14.3.1 Template type arguments ローカルクラスをテンプレート引数に利用できないとする制限が削除されました。 ただし、§14.5.2 Member templates ¶2 のローカルクラスではメンバーテンプレートを持てないとする記述(A local class shall not have member template.)は残っているままなので注意。 C++0x総復習 Boost.勉強会 #5 名古屋 90
  • 91. §14.3.1 Template type arguments C++0x総復習 Boost.勉強会 #5 名古屋 91 template <class T> class X { /* ... */ }; void f() { struct S { /* ... */ }; X<S> x3; // C++03 ではエラー X<S*> x4; // C++03 ではエラー }
  • 92. §14.5.3 Variadic templates 可変長template引数が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 92 template<class ... Types> struct Tuple { }; Tuple<> t0; // Types contains no arguments Tuple<int> t1; // Types contains one argument: int Tuple<int, float> t2; // Types contains two arguments: int and float Tuple<0> error; // error: 0 is not a type template<class ... Types> void f(Types ... rest); template<class ...Types> void g(Types ... rest) { f(&rest ...); // “&rest ...” is a pack expansion; “&rest” is its pattern }
  • 93. §14.5.3 Variadic templates C++0x総復習 Boost.勉強会 #5 名古屋 93 template<typename...> struct Tuple {}; template<typename T1, typename T2> struct Pair {}; template<class ...Args1> struct zip { template<class ...Args2> struct with { typedef Tuple<Pair<Args1, Args2> ...> type; }; }; typedef zip<short, int>::with<unsigned short, unsigned>::type T1; // T1 is Tuple<Pair<short, unsigned short>, Pair<int, unsigned>> typedef zip<short>::with<unsigned short, unsigned>::type T2; // error: different number of arguments specified for Args1 and Args2 template<class ...Args> void g(Args ...args) { // OK: Args is expanded by the function parameter pack args f(const_cast<const Args*>(&args)...); // OK: “Args” and “args” are expanded f(5 ...); // error: pattern does not contain any parameter packs f(args); // error: parameter pack “args” is not expanded f(h(args ...) + args ...); // OK: first “args” expanded within h, second // “args” expanded within f }
  • 94. §14.5.3 Variadic templates template引数の数の取得には sizeof … を使用する。 C++0x総復習 Boost.勉強会 #5 名古屋 94 template<class ... Types> struct Tuple { static int size = sizeof ... (Types); };
  • 95. §14.5.3 Variadic templates 可変長template引数の最初の引数を取得するといった手段は直接的には提供されていない為、必要に応じて次のようなテクニックを使う。 C++0x総復習 Boost.勉強会 #5 名古屋 95 template<class First, class ...Trail> struct GetFirst { typedef First Type; }; template<class ... Types> struct Tuple { typedef typename GetFirst<Types ...>::Type FirstType; };
  • 96. §14.5.7 Alias templates 別名templateが導入されました。 指定には using キーワードを使用する。 別名はあくまで別名でしかない為、タイプマッチング等ではオリジナルのtemplateを直接使用したのと同じように処理されるので注意。 C++0x総復習 Boost.勉強会 #5 名古屋 96
  • 97. §14.5.7 Alias templates C++0x総復習 Boost.勉強会 #5 名古屋 97 template<class T> struct Alloc { / ... / }; template<class T> usingVec = vector<T, Alloc<T>>; Vec<int> v; // same as vector<int, Alloc<int>> v; template<class T> void process(Vec<T>& v) { / ... / } template<class T> void process(vector<T, Alloc<T>>& w) { / ... / } // error: redefinition template<template<class> class TT> void f(TT<int>); f(v); // error: Vec not deduced template<template<class,class> class TT> void g(TT<int, Alloc<int>>); g(v); // OK: TT = vector
  • 98. §14.7.2 Explicit instantiation 自動インスタンス化を防ぐ明示的インスタンス化宣言が導入されました。 参考情報: http://msdn.microsoft.com/en-us/library/by56e477.aspx( Microsoft Specific の部分が C++0x の仕様として採用されたっぽいです。 ) C++0x総復習 Boost.勉強会 #5 名古屋 98 extern template class MyStack<int, 6>;
  • 100. 15.1 Throwing an exception throw された例外オブジェクト(のコピー)の寿命がstd::exception_ptrで参照されている場合、参照が無くなるまで延命されました。 throw できる例外オブジェクトの要件である「コピーコンストラクタを持っていてデストラクタにアクセス可能であること」が「コピーコンストラクタあるいはムーブコンストラクタを持っていてデストラクタにアクセス可能であること」に修正されました。 C++0x総復習 Boost.勉強会 #5 名古屋 100
  • 101. §15.4 Exception specifications 例外仕様に例外を投げないこと明示する noexcept が追加され、従来の例外仕様は動的例外仕様と呼ばれるようになりました。 参考情報: 本の虫: ややこしいnoexcepthttp://cpplover.blogspot.com/2010/10/noexcept.html C++0x総復習 Boost.勉強会 #5 名古屋 101 void f() noexcept ; // noexcept(true)と同じ void g() noexcept(true) ; // 例外を投げない void h() noexcept(false) ; // 例外を投げる
  • 103. §16.3 Macro replacement ¶5 可変長マクロ引数を扱う為の __VA_ARGS__が導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 103 #if define(NDEBUG) #deine DEBUG_printf(...) printf(__VA_ARGS__) #else #deine DEBUG_printf(...) ((void)0) #endif
  • 104. §16.8 Predefined macro names __cplusplusマクロの指し示す値が 199711L から201103L に変わります。 C++0x総復習 Boost.勉強会 #5 名古屋 104
  • 105. §16.8 Predefined macro names 次の組み込みが追加されました。 __STDC_HOSTED__ __STDC_MB_MIGHT_NEQ_WC__ __STDC_VERSION__ __STDC_ISO_10646__ __STDCPP_STRICT_POINTER_SAFETY__ __STDCPP_THREADS__ C++0x総復習 Boost.勉強会 #5 名古屋 105
  • 106. §16.8 Predefined macro names __STDC_HOSTED__ ホスト処理系(標準に準拠した処理系)である場合に1。そうでなければ0。 __STDC_MB_MIGHT_NEQ_WC__ 'a' == L'a' が成立しない場合に1。 __STDC_VERSION__ 処理系定義の値で、C99 に準拠している場合には 199901L となることが期待されます。 C++0x総復習 Boost.勉強会 #5 名古屋 106
  • 107. §16.8 Predefined macro names __STDC_ISO_10646__ wchar_t に格納される文字コードが ISO/IEC 10646 (UNICODE) に準拠している場合に定義され、その値は準拠しているISO/IEC 10646のバージョンに合わせて yyyymmLの書式で 199712L などのように定義される。 __STDCPP_STRICT_POINTER_SAFETY__ 処理系が strict pointer safety を持つ場合に1として定義されます。(そうでない場合、処理系は relaxed pointer safety を持つ) __STDCPP_THREADS__ マルチスレッド実行が可能な場合に1として定義されます。 C++0x総復習 Boost.勉強会 #5 名古屋 107
  • 108. §16.9 Pragma operator _Pragma オペレーターが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 108 #define LISTING(x) PRAGMA(listing on #x) #define PRAGMA(x) _Pragma(#x) LISTING( ..isting.dir ) // #pragma listing on "..isting.dir" と等価
  • 110. §17.6.4.2.2 Namespace posix C++0x総復習 Boost.勉強会 #5 名古屋 110 ISO/IEC 9945 およびその他のPOSIXの為に namespace posixが予約されました。
  • 111. §17.6.4.3.5 User-defined literal suffixes C++0x総復習 Boost.勉強会 #5 名古屋 111 アンダースコアで始まらないユーザー定義リテラルサフィックスが将来の標準の為に予約されました。 ->ユーザーコーディングでユーザー定義リテラルを使う場合、サフィックスはアンダースコアで始めること。で、且つアンダースコアで始まるグローバルな名前は§17.6.4.3.2で予約されてるので、ユーザー定義リテラルをグローバルな名前空間で使うのは禁止。(´Д`;
  • 112. §18Language support library C++0x総復習
  • 113. §18.2 Types 次の型が <cstddef> ヘッダーに追加されました。 std::max_align_t 処理系がサポートする最大のアライメントを持つ型 std::nullptr_t nullptr リテラルの型 C++0x総復習 Boost.勉強会 #5 名古屋 113
  • 114. §18.4 Integer types <cstdint>ヘッダが導入されました。次の型がstd 名前空間で提供されます。 int8_t int16_t int32_t int64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t int_least8_t int_least16_t int_least32_t int_least64_t intmax_tintptr_t uint8_t uint16_t uint32_t uint64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t uintmax_tuintptr_t C++0x総復習 Boost.勉強会 #5 名古屋 114
  • 115. §18.5 Start and termination <cstdlib> から利用できる次の関数が追加れました。 [[noreturn]] void _Exit(int status) noexcept; 各種オブジェクトのデストラクタすら呼び出さずに即プログラムを終了させる。 extern "C" int at_quick_exit(void (*f)(void)) noexcept; extern "C++" int at_quick_exit(void (*f)(void)) noexcept; quick_exit() から呼び出される関数を登録します。 処理系は少なくとも32個の関数を登録できるようにすることが推奨されます。 [[noreturn]] void quick_exit(int status) noexcept; at_quick_exit() で登録された関数を全て呼び出した後に _Exit() を呼び出します。 C++0x総復習 Boost.勉強会 #5 名古屋 115
  • 116. §18.6.2.5 get_new_handler set_new_handler() でセットしたハンドラを取得できる次の関数が追加されました。 new_handlerget_new_handler() noexcept; C++0x総復習 Boost.勉強会 #5 名古屋 116
  • 117. §18.7.1 Class type_info type_infoクラスに次のメンバー関数が追加されました。 size_t hash_code() const noexcept; a == b なら a.hash_code() == b.hash_code() で a != b なら a.hash_code() != b.hash_code() な値を返します。 C++0x総復習 Boost.勉強会 #5 名古屋 117
  • 118. §18.8 Exception handling <exception>ヘッダに次のクラスとそれに関連する関数が追加されました。 exception_ptrクラス nested_exceptionクラス C++0x総復習 Boost.勉強会 #5 名古屋 118
  • 119. §18.8 Exception handling exception_ptr クラス 例外オブジェクトに対するスマートポインタで、catch 句を抜けた後でもこのexception_ptrにより例外オブジェクトを保持できます。 exception_ptrに関連する関数 exception_ptrcurrent_exception() noexcept; 現在 throw されてる例外オブジェクトを保持する exception_ptrを取得する。 [[noreturn]] void rethrow_exception(exception_ptr p); 引数で渡された exception_ptrが保持している例外オブジェクトを再送出する。 template<class E> exception_ptrmake_exception_ptr(E e) noexcept; 引数で渡されたオブジェクトを保持する exception_ptrを返す。 エラーハンドリング Boost.勉強会 #3 関西 119
  • 120. nested_exceptionクラス ネストされた例外オブジェクト メンバー関数抜粋 [[noreturn]] void rethrow_nested() const; ネストの内側の例外オブジェクトを再送出。 exception_ptrnested_ptr() const noexcept; ネストの内側の例外オブジェクトを保持する exception_ptrを返す。 nested_exceptionクラスに関連する関数 [[noreturn]] template <class T> void throw_with_nested(T&& t); 引数で渡されたオブジェクトがnested_exceptionを継承している場合はそのまま、されていない場合は元の型とnested_exceptionの両方を継承している型で例外を送出する。 template <class E> void rethrow_if_nested(const E& e); 引数で渡されたオブジェクトがpublicにnested_exceptionを継承している場合にのみそのrethrow_nested()を呼び出します。 エラーハンドリング Boost.勉強会 #3 関西 120
  • 121. §18.8 Exception handling set_unexpected() のget側である次の関数も追加されました。 terminate_handlerget_terminate() noexcept; C++0x総復習 Boost.勉強会 #5 名古屋 121
  • 122. §18.9 Initializer lists std::initializer_listクラステンンプレートが定義されている <initializer_list>ヘッダが追加されました。 C++0x総復習 Boost.勉強会 #5 名古屋 122
  • 123. §18.9 Initializer lists C++0x総復習 Boost.勉強会 #5 名古屋 123 namespace std { template<class E> class initializer_list { public: typedef E value_type; typedef const E& reference; typedef const E& const_reference; typedef size_t size_type; typedef const E* iterator; typedef const E* const_iterator; initializer_list() noexcept; size_t size() const noexcept; // number of elements const E* begin() const noexcept; // first element const E* end() const noexcept; // one past the last element }; // 18.9.3 initializer list range access template<class E> const E* begin(initializer_list<E> il) noexcept; template<class E> const E* end(initializer_list<E> il) noexcept; }
  • 125. §19.4 Error numbers <cerrno>ヘッダで定義される変数が大幅に増えました。 ECONNREFUSED E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED EIO ECONNRESET EDEADLK EDESTADDRREQ EDOM EEXIST EFAULT EFBIG EHOSTUNREACH EIDRM EILSEQ EINPROGRESS EINTR EINVAL ENODEV EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODATA ENOTEMPTY ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG ENOPROTOOPT ENOSPC ENOSR ENOSTR ENOSYS ENOTCONN ENOTDIR ERANGE ENOTRECOVERABLE ENOTSOCK ENOTSUP ENOTTY ENXIO EOPNOTSUPP EOVERFLOW EOWNERDEAD EPERM EPIPE EPROTO EPROTONOSUPPORT EPROTOTYPE EROFS ESPIPE ESRCH ETIME ETIMEDOUT ETXTBSY EWOULDBLOCK EXDEVerrno C++0x総復習 Boost.勉強会 #5 名古屋 125
  • 126. §19.5 System error support OSあるいはその他基本ソフトウェアのネイティブのエラーコードをサポートするためのライブラリが導入されました。ヘッダは<system_error>。 C++0x総復習 Boost.勉強会 #5 名古屋 126
  • 127. §19.5 System error support C++0x総復習 Boost.勉強会 #5 名古屋 127 namespace std { class error_category; class error_code; class error_condition; class system_error; template <class T> struct is_error_code_enum : public false_type {}; template <class T> struct is_error_condition_enum : public false_type {}; enum class errc { ... }; template <> struct is_error_condition_enum<errc> : true_type { } error_code make_error_code(errc e) noexcept; error_condition make_error_condition(errc e) noexcept; // 19.5.4 Comparison operators: ... } // namespace std
  • 128. §20General utilities library C++0x総復習
  • 129. §20.7 Smart pointers <memory>ヘッダに次のスマートポインタが導入されました。 unique_ptr(§20.7.1) auto_ptrの改善版。 shared_ptr(§20.7.2.2) 所有を共有するスマートポインタ。 weak_ptr(§20.7.2.3) 循環参照問題を回避する為のスマートポインタ。 C++0x総復習 Boost.勉強会 #5 名古屋 129
  • 130. §20General utilities library 他にも tuple だの ratio だの chronoだのいろいろ追加されます。 C++0x総復習 Boost.勉強会 #5 名古屋 130
  • 132. §21 Strings library char16_t, char32_t に合わせて、 u16string, u32string 等々が追加されいます。 C++0x総復習 Boost.勉強会 #5 名古屋 132
  • 134. §22.5 Standard code conversion facets 文字エンコーディング変換の為の <codecvt>ヘッダが追加されています。 ->あんまり期待はできなさそう。 C++0x総復習 Boost.勉強会 #5 名古屋 134
  • 135. §23Containers library C++0x総復習
  • 136. §23Containers library 新たなコンテナおよび同名の次のヘッダが追加されました。 <array> <forward_list> <unordered_map> <unordered_set> C++0x総復習 Boost.勉強会 #5 名古屋 136
  • 140. §25Algorithms library all_of(§25.2.1), any_of(§25.2.2), none_of(§25.2.3), is_permutation(§25.2.12), move(§25.3.2) が追加されました。 C++0x総復習 Boost.勉強会 #5 名古屋 140
  • 142. §26.5 Random number generation 乱数まわりが大幅に強化されました。 C++0x総復習 Boost.勉強会 #5 名古屋 142
  • 146. §28Regular expressions library 正規表現ライブラリが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 146
  • 147. §29Atomic operations library C++0x総復習
  • 148. §29Atomic operations library Atomic操作ライブラリが導入されました。 C++0x総復習 Boost.勉強会 #5 名古屋 148
  • 151. Annex A Grammar summary C++0x総復習
  • 152. Annex A Grammar summary 文法の仕様変更に合わせてこの要約も修正されているだけなので特筆事項はなし。 C++0x総復習 Boost.勉強会 #5 名古屋 152
  • 153. Annex B Implementation quantities C++0x総復習
  • 154. Annex B (informative) Implementation quantities 次の最小の推奨値について追加・修正されました。 at_quick_exit() で登録できる関数 (32) constexpr 関数の再帰呼び出し(512) 入れ子templateの再帰的インスタンス化(17->1024) プレースホルダの数(10) C++0x総復習 Boost.勉強会 #5 名古屋 154
  • 155. Annex C Compatibility C++0x総復習
  • 156. Annex C Compatibility 重要な互換性に関する情報がしれっと沢山明記されています。 規格書の性質上旧バージョンとの差異については本体部分には直接的に明記されない為、ここで補完されています。 C++0x総復習 Boost.勉強会 #5 名古屋 156
  • 157. Annex C Compatibility §C.1 C++ and ISO C はC言語との差分の話だから読み飛ばして、C++03 との差分をチェックしようと§C.2 C++ and ISO C++ 2003 をしっかり読もうかと思ったら、ここにも落とし穴があって、内容的に§C.1 と被る内容は§C.2には記述されていないので§C.1も読む必要があります! C++0x総復習 Boost.勉強会 #5 名古屋 157
  • 158. Annex C Compatibility 具体的に書かれている内容をピックアップすると… char * str = "invalid!";が invalid に!( §C.1.1 Clause 2: lexical conventions ) 整数に対する / および % の演算結果が負の値の場合でもゼロに近いほうへ丸めることに!( §C.2.2 Clause 5: expressions ) 記憶域種別指定子としての auto が削除されたってのも直接的な明記があるのはここ。( §C.2.3 Clause 7: declarations ) 禁止されたマクロ名に override, final, carries_dependency, noreturn を追加。( §C.2.7 Clause 17: library introduction ) C++0x総復習 Boost.勉強会 #5 名古屋 158
  • 159. Annex D Compatibility features C++0x総復習
  • 160. Annex D Compatibility features 新たに deprecated になったもの。 記憶域種別指定子としての register ユーザー定義のコピー代入operatorあるいはユーザー定義のデストラクタを持つクラスの暗黙的に作成されるコピーコンストラクタ 動的例外仕様 unary_functionおよび binary_functionクラステンプレート ptr_fun, mem_fun, mem_fun_refアダプタ binder1st, bind1st, binder2nd, bind2nd バインダ unexpected_handlerまわり 動的例外仕様が deprecated なので。 auto_ptr 代わりに unique_ptrを推奨 C++0x総復習 Boost.勉強会 #5 名古屋 160
  • 161. Annex E Universal character names for identifier characters C++0x総復習
  • 162. Annex E Universal character names for identifier characters ユニバーサルキャラクタ名として許可されている文字範囲から文字種の表記が消えました。 ユニバーサルキャラクタ名として禁止されている文字範囲の記述が増えました。 C++0x総復習 Boost.勉強会 #5 名古屋 162
  • 163. Annex f Cross references C++0x総復習
  • 164. Annex f Cross references クロスリファレンスが追加されました。 C++0x総復習 Boost.勉強会 #5 名古屋 164
  • 166. 規格 ISO/IEC 14882 C++ の国際規格。初版は ISO/IEC 14882:1998 で、現行版は ISO/IEC 14882:2003 。 JIS X 3014 C++ のJIS規格で ISO/IEC 14882 の邦訳版。現在は JIS X 3014:2003 のみ。 C++0x総復習 Boost.勉強会 #5 名古屋 166
  • 167. 規格 FDIS Final Draft International Standard の略で、各国の投票により可決されれば、typo などの修正を除き原則的にほぼそのままIS(国際規格)となる。 C言語の規格 ISO/IEC 9899 JIS X 3010 C++0x総復習 Boost.勉強会 #5 名古屋 167
  • 168. C++の呼称 C++03 ISO/IEC 14882:2003 のC++のこと。 C++0x C++03 の次の C++ のこと。200X年にリリースされる次期C++としてそう呼ばれていたが実際には201X年にもつれ込んだ。既にさらに次のC++1xの名称が使われ出していたこともあり、混乱を避ける為にC++0xのまま通すことになった。 C++1x C++0x の次の C++ のこと。201X年にリリースされる予定。 C++0x総復習 Boost.勉強会 #5 名古屋 168
  • 169. 参考情報 C++ Glossaryhttp://www.kmonos.net/alang/cpp/glossary.html( C++関連の各種略語の解説があります。 ) C++0xの言語拡張まとめ(※随時更新)http://d.hatena.ne.jp/faith_and_brave/20071022/1193052163 C++0x - Wikipediahttp://ja.wikipedia.org/wiki/C%2B%2B0x( C++0xで導入される各種機能の解説があります。 ) C++0x - the next ISO C++ standard (英語)http://www2.research.att.com/~bs/C++0xFAQ.html C++0x総復習 Boost.勉強会 #5 名古屋 169