2016-02-25

C++標準化委員会の文書のレビュー: P0003R1-P028R1

P0003R1: Removing Deprecated Exception Specifications from C++17

道的な例外指定を取り除く提案。

動的例外指定とは以下のような機能をいう。

void f() throw( int, double, int * ) ;

C++98の規格が制定される頃には、すでに動的例外指定の利用例はほとんどなかった。C++11で、例外指定から動的例外指定に改名された上で、deprecated扱いにされた。

十分な移行期間を与えたので、C++17で取り除く。

P0005R3: Adopt 'not_fn' from Library Fundamentals 2 for C++17

Library Fundamentals TSで提案されているVariadic Templatesを使ったnot_fnを先行して標準規格に追加する提案。

deprecated扱いされたnot1, not2と違い、引数をいくらでも取れる。

template < typename ... Types >
bool f( Types ... args ) ;

int main()
{
    auto g = std::not_fn(&f) ;

    // 任意個の引数に対応
    g(1) ;
    g(1,2) ;
    g(1,2,3) ;
}

P0009r1 : Polymorphic Multidimensional Array Reference

配列のレイアウト(FORTRANの列優先レイアウトとCの行優先レイアウト)や、構造体の配列と配列の構造体(構造体の各データメンバーがそれぞれ配列になったレイアウト)などの差異を吸収するポリモーフィックな多次元配列ラッパーである、array_refライブラリの提案。

[PDF] P0010R0: Adding a subsection for concurrent random number generation in C++17

C++の乱数ライブラリは並列アクセスできないのでその注意を文面に追加する提案。

P0018R2: Lambda Capture of *this by Value as [=,*this]

lambda式に*thisを値でキャプチャする文法の追加。

lambda式は*thisを値でキャプチャーできない。

struct S
{
    int x ;
    auto f()
    {
        return [=]{ return x ; } ;
    }
} ;

int main()
{
    std::function<int()> f ;

    {
        S s ;
        f = s.f() ;
    }

    // 実行時エラー、オブジェクトsはすでに破棄されている。
    f() ; 

}

なぜならば、コピーしている値はthisポインターであって、*thisではないからだ。上記のコードで、[=]と[&]は同じ意味になる。

そのため、新しいsimple-captureとして、*thisを追加する提案。上記のコードは、以下のように書き換えればエラーにならない。

auto f()
{
    return [*this]{ return x ; }
}

P0019R1 : Atomic View

非アトミックオブジェクトに対してアトミック操作を提供するatomic_viewライブラリの提案。既存のコードの変数の定義を変えるのが現実的ではないコードに足して現実的なライブラリ。


int data ; // 変更不可能

void f()
{
    std::experimental::atomic_view adata( data ) ;
    ++data ; // アトミック操作
}

P0020r1 : Floating Point Atomic

浮動小数点数型に対して使えるatomic_viewライブラリ。

P0024R1: The Parallelism TS Should be Standardized

<algorithm>に並列実行版を追加するParallelism TSの実装経験を検討した結果、標準規格に取り入れるべきであるとする提案。

[PDF] P0028R1: Using non-standard attributes

attirbuteの名前空間の省略記法の提案。

独自のattributeトークンを使った独自拡張は、トークンの重複を防ぐためにattribute名前空間を使うことが多い。

void f() {
    [[rpr:: kernel, rpr:: target(cpu,gpu)]]
    do task();
}

しかし、attribute名前空間をいちいち指定するのは面倒なので、using宣言に相当するような機能がほしい。そこで、この提案は、そのような機能を付け加える。

void g() {
    [[ using rpr: kernel, target(cpu,gpu)]]
    do task();
}

キーワードはとりあえずusingにしているが、変わるかもしれない。

ドワンゴ広告

来月はドワンゴのセミナールームでだいぶ血の気のあらそうな勉強会が開催されます。

歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」 - connpass

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2 comments:

Anonymous said...

++data ; // アトミック操作

++adata;
では?

Anonymous said...

ラムダでイベントドリブンのプログラムを書きたいでござる。書きたいでござる。
まだ拙者の経験がたりないでござるぅー。