8. §1.10 Multi-threaded executions and data racesマルチスレッド実行が言語仕様上、意識されるようになり、マルチスレッドで動作する際の挙動が定義されました。参考情報:C++0x Memory Model 第0回 - メモリモデルとは何かhttp://d.hatena.ne.jp/Cryolite/20101226#p1C++0x Memory Model 第1回 - 1.9 Program executionhttp://d.hatena.ne.jp/Cryolite/20101228#p1C++0x総復習 Boost.勉強会 #5 名古屋8
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 whileC++0x総復習 Boost.勉強会 #5 名古屋13
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
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 expressionsC++0x総復習 Boost.勉強会 #5 名古屋32int a = 42;auto b = [a](){ return a; }; // b 内の a はコピーauto c = [=](){ return a; }; // b と等価int d = b(); // -> 42int 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(); // -> 42int 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 と等価(戻り型の明示)
35. §5.19 Constant expressionsconstexpr が導入されました。C++0x総復習 Boost.勉強会 #5 名古屋35constexpr const int* addr(const int& ir) { return &ir; } // OKstatic const int x = 5;constexpr const int* xp = addr(x); // OK: (const int*)&(const int&)x is an // address constant expressionconstexpr 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 expressionsC++0x総復習 Boost.勉強会 #5 名古屋36int x; // not constantstruct 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 substitutionconstexpr int w = A(false).m; // error: initializer for m is // x, which is non-constant
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 名古屋44const 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 intdecltype(a->x) x3; // type is doubledecltype((a->x)) x4 = x3; // type is const double&
45. §7.1.6.4 auto specifier型を推論してくれるauto型識別子が導入されました。C++0x総復習 Boost.勉強会 #5 名古屋45auto x = 5; // OK: x has type intconst auto *v = &x, u = 6; // OK: v has type const int*, u has type const intstatic auto y = 0.0; // OK: y has type doubleauto int r; // error: auto is not a storage-class-specifier
50. §7.3.1 Namespace definitioninline namespace が導入されました。C++0x総復習 Boost.勉強会 #5 名古屋50namespace a {inline namespace b { int c; }}int d = a::b::c;int e = a::c;
62. §8.5 Initializers¶15初期化の構文中で ( ) の代わりに { } も使えるようになりました。関連:§15.1, §15.3, §8.5.1, §12.8C++0x総復習 Boost.勉強会 #5 名古屋62class 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-initializationC++0x総復習 Boost.勉強会 #5 名古屋63初期化リストが導入されました。int a = {1};std::complex<double> z{1,2};new std::vector<std::string>{"once", "upon", "a", "time"}; // 4 string elementsf({"Nicholas","Annemarie"} ); // pass list of two elementsreturn {"Norah" }; // return list of one elementint* e {}; // initialization to zero / null pointerx = double{1}; // explicitly construct a doublestd::map<std::string,int> anim = {{"bear",4},{"cassowary",2},{"tiger",7}};
77. §12.3.2 Conversion functions ¶2変換関数にも explicit が指定できるようになりました。C++0x総復習 Boost.勉強会 #5 名古屋77class 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 membersC++0x総復習 Boost.勉強会 #5 名古屋79struct 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 名古屋80struct A { int b =42; std::string c("truth");A() { }};
81. §12.6.2 Initializing bases and membersC++0x総復習 Boost.勉強会 #5 名古屋81struct 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 objectsC++0x総復習 Boost.勉強会 #5 名古屋83struct Y { Y(const Y&);Y(Y&&);};extern Y f(int);Y d(f(1)); // calls Y(Y&&)Y e = d; // calls Y(const Y&)
89. §14.2 Names of template specializationsクラステンプレートをネストした際の閉じ山括弧をスペースでセパレートしなくてよくなりました。C++0x総復習 Boost.勉強会 #5 名古屋89template<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 errorY<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 argumentsC++0x総復習 Boost.勉強会 #5 名古屋91template <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 名古屋92template<class ... Types> struct Tuple { };Tuple<> t0; // Types contains no argumentsTuple<int> t1; // Types contains one argument: intTuple<int, float> t2; // Types contains two arguments: int and floatTuple<0> error; // error: 0 is not a typetemplate<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 templatesC++0x総復習 Boost.勉強会 #5 名古屋93template<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 Args2template<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 }
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
161. Annex E Universal character names for identifier charactersC++0x総復習
162. Annex E Universal character names for identifier charactersユニバーサルキャラクタ名として許可されている文字範囲から文字種の表記が消えました。ユニバーサルキャラクタ名として禁止されている文字範囲の記述が増えました。C++0x総復習 Boost.勉強会 #5 名古屋162
166. 規格ISO/IEC 14882C++ の国際規格。初版は ISO/IEC 14882:1998 で、現行版は ISO/IEC 14882:2003 。JIS X 3014C++ のJIS規格で ISO/IEC 14882 の邦訳版。現在は JIS X 3014:2003 のみ。C++0x総復習 Boost.勉強会 #5 名古屋166
167. 規格FDISFinal Draft International Standard の略で、各国の投票により可決されれば、typo などの修正を除き原則的にほぼそのままIS(国際規格)となる。C言語の規格ISO/IEC 9899JIS X 3010C++0x総復習 Boost.勉強会 #5 名古屋167
168. C++の呼称C++03ISO/IEC 14882:2003 のC++のこと。C++0xC++03 の次の C++ のこと。200X年にリリースされる次期C++としてそう呼ばれていたが実際には201X年にもつれ込んだ。既にさらに次のC++1xの名称が使われ出していたこともあり、混乱を避ける為にC++0xのまま通すことになった。C++1xC++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/1193052163C++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.htmlC++0x総復習 Boost.勉強会 #5 名古屋169