2016-07-21

C++標準化委員会の文書: P0290R0-P0299R0

P0290R0: apply() for synchronized_value

N4033で提案されているsynchronized_value<T>に対してapply()関数を提供する提案。第一引数に関数オブジェクトを取り、第二引数以降のsyncrhonized_valueを適用する。

synchronized_value<T> s1, s2, s3 ;

int main()
{
    int i = 0 ;
    apply( [&]( auto && s ) { s = ++i ; }, s1, s2, s3 ) ;

P0292R1: P0292R1: constexpr if: A slightly different syntax

この提案はC++17に採用された。以下の内容はまだ公開されていないが採択されたP0292R2の内容を元にしている。

constexpr ifの提案。この提案は条件付きコンパイルではない。実行されない方のブランチのテンプレートの実体化を防ぐif文だ。

constexpr ifの文法は、if文と条件の間にconstexprキーワードを記述する。


if constepxr ( condition )
    statement
else
    statement

conditionは文脈上boolに変換される。もしconditionがfalseならば、1番目のstatementが、trueならば2番目のstatementが、discarded statement(廃棄文)となる。

constexpr ifの実行時の挙動は、if文と同じだ。conditionの値に応じて、どちらかの文が実行される。ただし、コンパイル時の挙動が少し違う。

constexpr ifを持つテンプレートエンティティが実体化されるとき、discarded statement内のテンプレートの実体化は行われない。

template < typename T >
void f( T t )
{
    if constexpr ( std::is_same_v< std::decay_t<T>, std::string > )
    {
        t.compare( "hello" )
    }
    
}

関数fは、実引数にstd::stringが渡された場合、メンバー関数のcompareを呼び出す。もし実引数にstd::stringが渡されなかった場合は、conditionがfalseになるので、constexpr if文のsubstatementはdiscarded statementとなる。テンプレート内のdiscarded statementは、インスタンス化されないので、変数tにメンバーcompareがなかったとしても、コンパイルエラーにはならない。

constexpr ifは、以前提案されていたstatic ifと違い、条件コンパイルではない。テンプレート内で使った時に、discarded statementがインスタンス化されないだけだ。それ以外はif文と同じだ。

例えば、ill-formedなトークン列は、当然ill-formedになる。

// ill-formed
if constexpr ( false )
{
!@#$%^&*()
}

インスタンス化せずともill-formedなテンプレートのコードは当然ill-formedとなる。

template < typename T >
void f()
{
    if constexpr ( false )
    {// ill-formed
        not_found ;
    }
}

このコードでは、非依存名であるnot_foundを使っているが、not_foundは宣言されていないのでill-formedとなる。

constexpr ifを非テンプレートなコードで使うことはできるが、通常のif文と同じ意味しかない。

void f()
{
    // ifと違いはない
    if constexpr ( false )
    {
    }
}

[PDF] P0295R0: Adopt Selected Library Fundamentals V2 Components for C++17

gcdとlcmをLibrary Fundamentals V2から抜き出してC++17に入れる提案。

P0296R2: Forward progress guarantees: Base definitions

Forward Progress Guarantee(ブロックされていないスレッドはいずれは必ず実行が進む保証)を文面に入れる提案。

[PDF] P0298R1: A byte type definition

1バイトを表現するstd::byte型の提案。

std::byte型は、underlaying typeがunsigned charなscoped enum型として追加される。

ビット列を操作する演算子がオーバーロードされている。

char型は符号の有無が未規定で生のバイト列を扱うには不適切な型である。

P0299R1: Forward progress guarantees for Parallelism TS features

タイトル通り、Parallelism TSにおけるforward progress guaranteeの文面の追加。

ドワンゴ広告

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

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

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

1 comment:

Anonymous said...

GCMとLCMはぜひ入ってほしいです。自分には検索無しで綺麗に書くのは難しいのでぜひ入ってほしいです。
byte型もそれなりにほしいです。ヘッダーはどこになるんでしょうかね。できれば簡単に使えるといいですね。