Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++17の新機能 言語編 / new features of C++17 - language

C++17の新機能 言語編 / new features of C++17 - language

C++17 で追加された言語機能の紹介です。
(言語編といっても、全言語機能を網羅しているわけじゃないです…)

説明がだいぶ雑ですが、許してください…

Miutsuru kariya

February 01, 2018
Tweet

More Decks by Miutsuru kariya

Other Decks in Programming

Transcript

  1. 入れ子名前空間の定義 N4026 Nested namespace definition http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4026.html N4116 Nested Namespace Definition

    (rev 1) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4116.pdf N4230 Nested namespace definition (revision 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html 3
  2. 入れ子名前空間の定義 導入の背景 5 namespace A { namespace B { namespace

    C { ・・・ } } } って書くのクソうざいんだが…
  3. 16進浮動小数点リテラル 対応 16 補足 16進浮動小数点リテラルは以下の形式 0xか0X + 仮数部 + pかP

    + 指数部 + 接尾辞(任意) 仮数部:16進数(小数点があってもいい) 指数部:符号(任意) + 10進数 接尾辞:普通の浮動小数点リテラルと一緒 表現される数値:仮数部×2^指数部
  4. トライグラフの削除 対応 26 余談 代替トークン一覧 代替 意味 代替 意味 代替

    意味 <% { and && and_eq &= %> } bitor | or_eq |= <: [ or || xor_eq ^= :> ] xor ^ not ! %: # compl ~ not_eq != %:%: ## bitand &
  5. テンプレートテンプレートパラメー タでtypenameを 背景 30 例 template<typename T> struct A {};

    template<typename T> using B = int; template<template<typename> class X> struct C; C<A> ca; // ok C<B> cb; // ok, not a class template template<template<typename> typename X> struct D; // error, cannot use typename here
  6. 式評価順の改善 N4228 Refining Expression Evaluation Order for Idiomatic C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4228.pdf

    P0145R0 Refining Expression Evaluation Order for Idiomatic C++ (Revision 1) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0145r0.pdf P0145R1 Refining Expression Evaluation Order for Idiomatic C++ (Revision 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r1.pdf P0145R2 Refining Expression Evaluation Order for Idiomatic C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r2.pdf P0145R3 Refining Expression Evaluation Order for Idiomatic C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf 35
  7. 式評価順の改善 導入の背景 37 次のプログラムには間違いがあります。どこでしょう? void f() { std::string s =

    "but I have heard it works even if you don’t believe in it"; s.replace(0, 4, "").replace(s.find("even"), 4, "only") .replace(s.find(" don’t"), 6, ""); assert(s == "I have heard it works only if you believe in it"); }
  8. 式評価順の改善 導入の背景 38 赤いところの評価順によってはassert失敗する。 void f() { std::string s =

    "but I have heard it works even if you don’t believe in it"; s.replace(0, 4, "").replace(s.find("even"), 4, "only") .replace(s.find(" don’t"), 6, ""); assert(s == "I have heard it works only if you believe in it"); }
  9. 式評価順の改善 対応 42 新たに評価順の規定対象となる演算子 a.b; a->b; a->*b; a(b1, b2, b3);

    b @= a; a[b]; a << b; a >> b; みんなaが先に評価されるようになった すごいぞ C++17!!!
  10. 式評価順の改善 対応 43 更に、関数呼び出しの各引数の評価順 は unsequenced(評価順の規定無し)か ら indeterminately sequenced(どの順序 で評価されるかは規定無し)になった!

    すごいぞ C++17!!! ※ unsequenced は各評価がオーバーラップしても良いが、 indeterminately sequenced はオーバーラップNG