C++標準化委員会の文書のレビュー: P0022R1-P0092R1
今回も改訂版の文書のレビュー。改定前の文書は、以下の記事でレビューしている。
本の虫: C++標準化委員会の文書のレビュー: P0021R0-P0029R0
本の虫: C++標準化委員会の文書のレビュー: P0030R0-P0039R0
本の虫: C++標準化委員会の文書: P0050R0-P0059R0
本の虫: C++標準化委員会の文書のレビュー: P0060R0-P0069R0
本の虫: C++標準化委員会の文書のレビュー: P0080R0-P0089R0
本の虫: C++標準化委員会の文書のレビュー: P0090R0-P0099R0
P0022R1: Proxy Iterators for the Ranges Extensions
vector
これまで存在はするもののあまり活用されていなかったiter_swapを、例外的な挙動をするイテレーターのためのカスタマイゼーションポイントとして定義しなおすほか、iter_moveを追加する。イテレーターを操作する際は、このライブラリを使えば、プロクシーイテレーターを意識せずに扱うことができる。
また、共通の束縛できるリファレンス型を得る。common_reference traitsを追加する。2つのイテレーターのvalue_typeをcommmon_referenceに渡すことでコードを汎用的にできる。common_referenceはcommon_typeに似ているが、トップレベルのCV修飾子とリファレンス修飾子を削らない。
P0025R1: clamp: An algorithm to 'clamp' a value between a pair of boundary values -
clamp( value, min, max )で、valueがminより小さければminが、maxより大きければmaxが、それ以外の場合はvalueが返る関数clampの提案。
[PDF] P0030R1: Proposal to Introduce a 3-Argument Overload to std::hypot
3引数版std::hypotの提案。
[PDF] P0032R1: Homogeneous interface for variant, any and optional (Revision 1)
variant, any, optionalというtype erasure機能を提供する用途の異なるライブラリが提案されている。type erasureという機能では共通しているこれらのライブラリは、インターフェースがバラバラだ。インターフェースをある程度統一する提案。
[PDF] P0051R1: C++ generic overload function (Revision 1)
非情に面白いoverloadライブラリの提案。関数オブジェクトを突っ込んで、突っ込んだ関数オブジェクトの中でオーバーロード解決が最適なものを呼び出してくれる。
std::f = std::overload(
[]( int x ) { }, // #1
[]( double d ) { }, // #2
[]( auto x ) { } ) ; // #3
f( 0 ) ; // #1
f( 0.0 ) ; // #2
f( "hello" ) ; // #3
実装例は前回の記事で解説したが極めて単純で興味深い。
前回からの変更点としては、最適関数を選ぶoverload, 呼び出し可能な最初の関数を選ぶfirst_overload, 格納した関数オブジェクトにアクセスする機能の3種類に提案を分割し、それぞれ独立して提案することにしたらしい。
[PDF] P0057R1: Wording for Coroutines
コルーチンの文面案。変更点は、とうとうキーワードが決定されたこと。co_await, co_yield, co_returnになった。なんだか泥臭い名前だ。しかし、await, yieldなど使えるわけがない。
future<void> g()
{
std::cout << "processing f" << std::endl ;
co_await f() ;
std::cout << "resumed" << std::endl ;
}
うーむ。バイク小屋バイク小屋。
P0061R1: Feature-testing preprocessor predicates for C++17
プリプロセッサーでのみ使える__has_includeの追加。ヘッダーファイルが存在するかどうかを調べられる。
#if __has_include(<any>)
#include <any>
using lib = std ;
#elif __has_include(<boost/any.hpp>)
#include <boost/any.hpp>
using lib = boost ;
#endif
lib::any a ;
[PDF] P0083R1: Splicing Maps and Sets (Revision 3)
listにあるsplice機能をmapにも提供する提案。前回からの変更点は、node_ptrがnode_handleになったこと。operator *, operator ->が廃止され、かわりにmappedとvalueというアクセッサー関数が追加されたこと。空の状態を調べられるempty関数が追加された。機能テストマクロが追加されたなど。
mapが管理する内部の動的に確保されたメモリ上に構築されたノードの所有権をmapから切り離すことができる機能。
extractでmapからノードの所有権を切り離す。切り離されたノードはnode_handleクラスを経由して扱う。node_handleはアロケーターのコピーも持っているので、破棄された時にはノードも破棄される。キーを変更することもできる。mergeでnode_handleの所有するノードをmapにマージできる。
キーを変更して差し戻すことにより、余計なメモリの破棄、確保を省略することができる。
P0092R1: Polishing chrono
chronoライブラリに対する機能追加。丸めモードの設定、符号付きduration型にabsを追加する。
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0