C++標準化委員会の文書: P0350R0-P0359R0
[PDF] P0350R0: Integrating datapar with parallel algorithms and executors
P0214で提案されているベクトル型、dataparを並列アルゴリズムに対応させて、専用の実行ポリシーを追加する提案。そこまで明示的にする必要があるのは本末転倒な気がする。
[PDF] P0352R0: Smart References through Delegation: An Alternative to N4477's Operator Dot
operator .をオーバーロードすることによりスマートリファレンスを実装可能にしようと言うのがN4477の提案だが、operator .の現在の提案は極めてややこしい。オーバーロード解決のルールにめちゃくちゃ複雑な新ルールを導入するものだ。
この提案では、派生機能を拡張した移譲機能を追加することにより、スマートリファレンスを実装可能にしようと言うものだ。
例えば、以下のように
template < typename T >
class shared_ref : public using T
{
std::shared_ptr<T> ptr ;
operator T &() { return *ptr ; }
public :
// auto x = shared_ref<T>{}のxの型はTになる
using auto = T ;
// sizeofの結果はsizeof(T)の結果になる。、
using sizeof = T ;
explicit shared_ref( shared_ptr<T> ptr ) : ptr(ptr)
{ }
// X::funcをhidingする。
void func() { }
} ;
このように、既存の派生と継承の上に作ることで、すでによく知られたルールを適用できる。文法はXから派生しているようだが、shared_refのオブジェクトはXのサブオブジェクトを持たない。Xへのリファレンスは、変換関数で取得できるようにしておくことで、shared_refをXとして使いたい場合には、変換関数が使われる。
この拡張によって、スマートリファレンスを実装できるほか、pimplイディオムなども、より自然に実装できる。
これはいい提案だ。operator .のオーバーロードよりはるかに気が利いている。派生と継承のルールはすでによく知られているのでわかりやすい。
入るべきだ。
P0353R0: Unicode Encoding conversions
UTF-8/UTF-16/UTF-32の間の相互変換ライブラリの提案。現在でもC++標準ライブラリで可能ではあるが、極めてクソなライブラリしかない。
using std::literals ;
auto u8str = u8"hello,world"s ;
auto u16str = std::to_u16string( u8str ) ;
auto u32str = std::to_u32string( u8str ) ;
u8str = std::to_u8string( u32str ) ;
UTF-8文字型にはcharではなくて独自の型がほしい。
[PDF] P0354R0: default == is >, default < is < so
P0221で提案されているデフォルトの大小比較演算子に対して、デフォルトの大小比較演算子は有害だと主張する文書。
クラスに対して、デフォルトの==と!=を生成するのはわかる。しかし、<はわからない。多くのクラスは大小比較可能ではない。大小比較がデフォルトで生成されるようになった場合、筆者はコーディング規約でデフォルトでオプトアウトするように支持し、そのためにマクロを使うことも吝かではない。そのような機能はデフォルトで有効にすべきではない。
その上で、文書はデフォルトの大小比較演算子について、以下のいずれかを取るべきだとしている。
- 採用しない
- デフォルトでオプトインにして、明示的な利用宣言を必要とする
- std::orderingのようなカスタマイゼーションポイントを提供して、特殊化することでオプトインにする
- 新しい演算子を追加する
文書は、採用しないことが最も望ましく、オプトインもカスタマイゼーションポイントや新しい演算子で行われるべきだと主張している。
P0355R0: Extending to Calendars and Time Zones
int main()
{
using namespace std::chrono_literals ;
auto date = 2016y/8/10 ;
std::cout << date ;
}
まあ、ある程度便利だ。日付、曜日、タイムゾーン、うるう秒などに対応している。
P0356R0: Simplified partial function application
std::bindに変わる単純なbindの提案。
bind_frontとbind_backは、関数オブジェクトfと、任意個の実引数を取り、関数オブジェクトを呼び出す際に、実引数の先頭か末尾に受け取った引数を付け加える。
auto front = std::bind_front( f, a, b, c ) ;
front( d, e, f ) ; // f( a,b,c,d,e,f )
auto back = std::bind_back( f, a, b, c )
back( d, e, f ) ; // f( d,e,f,a,b,c)
std::bindと違い、引数の順序変更や、引数の無視はできないが、この機能で実需要のほとんどは満たせるとしている。
個人的には、lambda式があるのでbind自体がいらないのではないかと思う。
P0357R0: 'reference_wrapper' for incomplete types
reference_wrapperを不完全型に対して使用可能にする提案。
P0358R0: Fixes for 'not_fn'
C++17に入るnot_fnの文面に問題があり、ref-qualifierを無視してしまうので、その修正をした新しい文面案の提案。
[PDF] P0359R0: SG5: Transactional Memory (TM) Meeting Minutes 2016/02/22-2016/05/23
SG5、トランザクショナルメモリーの会議の議事録
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0