Presentation is loading. Please wait.

Presentation is loading. Please wait.

読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++

Similar presentations


Presentation on theme: "読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++"— Presentation transcript:

1 読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++
稲葉

2 WHAT IT IS std::cout << f() << g() << h();
C++14 : f(), g(), h() の評価順序は未規定 提案 : f(), g(), h() の順で評価 std::map<key_t, size_t> m; m[key] = m.size(); C++14 : m[key] が 0 になるか 1 になるかは未規定 提案 : 0 になる void foo(unique_ptr<T> x, unique_ptr<T> y); foo(new T, new T); C++14 : メモリリークするかも 提案 : しない などなど、ある程度評価順序を規格で決める

3 WHAT IT IS *NOT* x = x++; f( a(), b(), c() ); これは変わらず未定義
ただし、(改造版Visual C++で実験してみた結果)“we feel confident recommending the left-to-right evaluation rules” と書いてあるので今後変わるかも

4

5 MOTIVATION foo().bar().buz() のようなメソッドチェーン << をストリームへの出力演算子として使う
(cf. std::future<>::then) << をストリームへの出力演算子として使う スマートポインタ などなど、Cに遡る “評価順序は不定” が最初に定義 された頃から比べると、様々なイディオムが発達して きており、それらのイディオムを自然に活用できるよう に言語サポートがあるべきだ」

6 この提案に関するMLのスレッド 「E << F」 と 「E <<= F」 で順序違うのは…
「E = F」 が右から左で Java や C# と違うのは… 「演算子の結合方向を考えても代入演算だけが右から 左なのは自然」 「C# チームに何故左から右と定義したのか聞いてみた ら(C++のように)左辺で頑張りまくることは、そもそもC# では少ないので…という反応だった」 Bjarne 「今新しく言語を設計するなら代入は左手の値 が右手に入るようにするんだけどなあ (脱線)」

7 この提案に関するMLのスレッド 「*ptr_expr = big_struct_expr;」 で先に左辺でア ドレスを計算してそこに右辺の結果を直に書き込むと いう最適化ができなくなる 「逆に右to左だからこそできる最適化も色々あると GCCの人は言っていた。it depends だ」

8 読んだもの2 P0144R1: Structured bindings
See Also: P0217R0: Proposed wording for structured bindings

9 WHAT IT IS

10 PROPOSED IMPL 右辺が配列型なら展開
右辺の型に対して .get<#>() メンバ関数か get<#>() ADL関数が適用できるなら、それを使っ て展開 構造体/クラスなら public メンバの先頭から順に 展開

11 DESIGN CHOICES auto のみ (明示的な型宣言やconcept宣言は扱わない)
auto& や const auto は サポート “Should there be a way to explicitly ignore variables?” not yet. std::tie における std::ignore 的な物を用意できたらい いが、変数宣言部なので簡単ではない “Should there be support for recursive destructuring?” not yet. 「複雑なことは pattern matching (C++ 2X?) を入れるときにそ のsyntaxに合わせるように考えたい」

12 この提案に関するMLのスレッド (合計で300レス以上燃えている)
右辺のtupleよりも変数リストが短い場合はエラーにすべ きでは?  そうする方向に検討が進んでいる模様 提案中のstd::variant にも get<#>があるので“分解”で きてしまう問題  問題が認識され始めたところ、議論中 auto じゃない型を明示させろ派が大変活発 Bjarne が蹴り続けている auto {x, y} = std::ensure<int, string>(f()); のようなヘルパー が書けるからいいだろと言っている人もいる。


Download ppt "読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++"

Similar presentations


Ads by Google