2016-03-18

C++標準化委員会の文書: P0142R0-P0167R1

[PDF] P0142R0: A Module System for C++ (Revision 4)

[PDF] P0143R0: Wording for Modules

[PDF] P0143R1: Wording for Modules

モジュールの提案と文面案。

残念なことに、モジュールはC++17では見送られることが確定した。

[PDF] P0144R1 Structured Bindings

多値から変数宣言と初期化を同時にする文法の提案。

現状では、多値を返す関数の宣言と、多値を返すことは簡単に書ける。

std::tuple< int, double, std::string > f()
{
    return { 1, 2.3, "4" } ;
}

このような関数から、それぞれの型の変数をそれぞれ初期化するのは面倒だ。std::tieを使っても、変数をあらかじめ宣言する必要がある。

int x ;
double y ;
std::string z ;

std::tie( x, y, z ) = f() ;

そこで、以下のような文法で、それぞれの型と値で変数を宣言初期化する機能を提案している。


auto { x, y, z } = f() ;

初期化子としては、std::get<N>をサポートする型(tupleとpair)の他、非staticデータメンバーがすべてpublicなクラス型もサポートされる。また、配列もサポートされていて、それぞれの要素で初期化される。

struct XYZ
{
    int x ;
    double y ;
    std::string z ;
} ;

XYZ f() { return { 1, 2.3, "4" } ; }

auto { x, y, z } = f() ;

int abc[3] = { 1, 2, 3 } ;
auto { a, b, c } = abc ;

これは便利なので入ってほしい。

[PDf] P0145R1: Refining Expression Evaluation Order for Idiomatic C++ (Revision 2)

式の評価順序を固定する提案。

f( a, b, c )という式があったときに、f, a, b, cの式がどの順番で評価されるかは未規定である。例えば、以下のコードの出力結果は未規定である。

void f( int a, int b, int c )
{
    std::cout << a << b << c ;
}

int main()
{
    int i = 0 ;
    f( ++i, ++i, ++i ) ;
}

提案では、ほとんどの式の評価順序を定めているが、唯一、関数の実引数の評価順序は定めていない。そのため、上のコードの出力だけはこの提案でもいまだに未規定である。ただし、f(a)は実引数aより呼び出し可能な式fが先に評価されることが保証されている。

関数の実引数の評価順序が未規定に戻ってしまったのは残念だ。

P0146R1: Regular Void (Revision 1)

void型を完全形にする提案。すなわち、void型のオブジェクトが作れる。

void v1 ;
void v2 = v1 ;
bool b = v1 == v2 ;
void vs[10] ;
auto vp = std::make_unique() ;

テンプレートパラメーターにvoid型を渡した時に例外的に特殊化して対応しなければならない問題が、void型を完全型にするだけで解決する。

[PDF] P0149R0: Generalised member pointers

メンバーポインターの型変換の制限を緩和する提案。

本当に需要がある変換なのだろうか。

[PDF] P0161R0: Bitset Iterators, Masks, and Container Operations

bitsetに2種類のイテレーターを追加する提案。iteratorとindex_iteratorが追加される。

iteratorのoperator *は、イテレーターの指す場所のビットのみがたったbitsetを返す。

std::bitset<3> b{0b110} ;
auto i = b.begin() ;

auto b0 = *i ; // bitset<3>{0b000}
auto b1 = *++i ; // bitset<3>{0b010}
auto b2 = *++i ; // bitset<3>{0b100}

index_iteratorは、イテレーターの指す場所をsize_tで返す。

std::bitset<3> b{0} ;

auto i = b.ibegin() ;
auto i0 = *i ; // 0
auto i1 = *++i ; // 1
auto i2 = *++i ; // 2

既存のコンテナーのイテレーターとは全く違うのでわかりにくい。iteratorは改名すべきだろう。

P0165R1: C++ Standard Library Issues to be moved in Jacksonville

Jacksonville会議で採用が決まった標準ライブラリの問題点の解決案。

P0165R1: Core Language Working Group "ready" Issues for the February, 2016 (Jacksonville) meeting

Jacksonville会議で採用が決まったコア言語の問題点の解決案。

ドワンゴ広告

もうすぐC++17のドラフトが本格的に固まってくるのだが、C++17の新機能として紹介できるわかりやすい大きなコア言語の変更があまりない。どれも小粒な変更ばかりだ。ライブラリはいくつか新しい物が入っているのだが。

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

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

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

2 comments:

Anonymous said...

p0144r1はスクリプトライクですね。嫌いじゃないです。ただ、コピーが増えて大丈夫かなーと思わんでもないです。
VCがClang食って超絶バージョンアップするらしいですけど、まだかなーと待ってます。
とにかくC++17で追いついてほしいですね。

Anonymous said...

モジュール機能先送りは愚行と思います