2016-08-15

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で提案されているデフォルトの大小比較演算子に対して、デフォルトの大小比較演算子は有害だと主張する文書。

クラスに対して、デフォルトの==と!=を生成するのはわかる。しかし、<はわからない。多くのクラスは大小比較可能ではない。大小比較がデフォルトで生成されるようになった場合、筆者はコーディング規約でデフォルトでオプトアウトするように支持し、そのためにマクロを使うことも吝かではない。そのような機能はデフォルトで有効にすべきではない。

その上で、文書はデフォルトの大小比較演算子について、以下のいずれかを取るべきだとしている。

  1. 採用しない
  2. デフォルトでオプトインにして、明示的な利用宣言を必要とする
  3. std::orderingのようなカスタマイゼーションポイントを提供して、特殊化することでオプトインにする
  4. 新しい演算子を追加する

文書は、採用しないことが最も望ましく、オプトインもカスタマイゼーションポイントや新しい演算子で行われるべきだと主張している。

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

3 comments:

Anonymous said...

UTF-Xに光をー。もっと整備をー。あとVCが超絶バージョンアップしてほしいです。マルチラインのconstexprとかまだかなー。などなど思ってます。

Anonymous said...

>lambda式があるのでbind自体がいらない
単純に幾つかの引数をbindするだけにlambdaを書くのも冗長なので、どうにかしたいのは確かなんですよね。
とはいえ、std::bind_XXXが冗長でないのかというと全くそんな事はないので、

int func(int a, int b);
std::function f = []func(10, int); // [](int b){ return func(10, b); }; と動議

みたいなのがあれば嬉しいものですが。

Anonymous said...

現行規格のcodecvtはUnicodeのencoding schemeとの変換で、P0353R0はencoding form同士の変換です。
同じUTF-8/UTF-16/UTF-32といった名前なので紛らわしいですが、目的も使いどころも大きく異なるものです。
Unicodeにご興味があればUnicode Version 9.0 Core Specificationの2.5, 2.6, 3.9, 3.10を読まれることをお勧めします。