2015-07-13

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

N4510: Minimal incomplete type support for standard containers, revision 4

vector, list, forward_listに対して、非完全形を要素型に認める提案。

以下のようなコードが書けるようになる。

struct Node
{
    std::vector< Node > nodes ;
    // ...
} ;

クラスは定義の終了を持って完全形となるので、この場合のvectorに渡すNode型は不完全型である。つまり、sizeofが取れないなどの問題がある。しかし、不完全型をサポートする実装は可能であり、このコードは実装によって通ったり通らなかったりしていた。

上記のパターンのコードは利用価値があることから、これを認める提案。まず、最も無難なコンテナーに限って認める。

N4511: Adding [nothrow-]swappable traits (Revision 1)

<type_traits>にstd::is_swappable<T>, std::is_swappable_with<T, U>, std::is_nothrow_swappable<T>, std::is_nothrow_swappable_with<T, U>を追加する提案。

N4512: Multidimensional bounds, offset and array_view, revision 7

連続したストレージを多次元配列に見せかけるラッパーライブラリ、array_viewの提案。前回の提案N4494に比べて、細かな変更が加えられている。

[PDF注意] N4513: Technical Specification for C++ Extensions for Transactional Memory

トランザクショナルメモリーTSのドラフト

[PDF注意] N4514: Technical Specification for C++ Extensions for Transactional Memory

トランザクショナルメモリーTS。内容はドラフトと同じ。

N4515: Editor's Report: Technical Specification for C++ Extensions for Transactional Memory

トランザクショナルメモリーの編集者による変更点の報告書。

[PDF注意] N4516: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4516.pdf

ライブラリベースの型安全なunionライブラリ、variantの提案。boost.variantの機能削減版といったところだ。

なお、このvariantは空状態を許容する。理由は、別の型のオブジェクトを代入された時に、元の型のオブジェクトを破棄した後で、代入に失敗した時の状態をどうするのかと考えると、空の状態を許容する設計になったそうだ。

[PDF注意] N4517: Record of Response: National Body Comments ISO/IEC PDTS 19841

トランザクショナルメモリーTSに対するNBコメントに対する返答。

N4518: Make exception-specifications be part of the type system, version 2

例外指定を型の一部に含める提案。現状では、例外指定はポインター同士の代入を制限すると規定されている。しかし、ポインターのポインターを介せば、例外の異なる関数へのポインター型が相互に代入できてしまう。

たとえば、core issue 92は以下のようなコードを問題視している。

void (*p)() throw(int);
void (**pp)() throw() = &p;   // not currently an error

これに対し、対応はしないと結論したものの、やはりなにかおかしい。

N4519: Source-Code Information Capture

ソースファイルの情報を取得できるリフレクションライブラリの提案、__LINE__などのようなプリプロセッサーで取得していた情報が、まともな方法で取得できるようになる。

#include <experimantal/source_location>

int main()
{
    auto sl = std::experimental::source_location::current() ;

    std::cout
            << sl.line() << '\n'
            << sl.column() << '\n'
            << sl.file_name() << '\n'
            << sl.function_name() << std::endl ;
}

source_location::currentは、呼び出した場所のsource_locationオブジェクトを返すconstexpr staticメンバー関数である。

なお、source_location::currentをデフォルト実引数で呼び出した場合、呼び出し元の情報が得られる。


void logger( std::experimantal::source_location sl = std::experimental::source_location::current() )
{
    // slにはlogger関数を呼び出した元の情報が入る。
}

ドワンゴ広告

最近、ドワンゴがかなりガチな条件で3DCGエンジニアを募集しているようだ。

【新規事業】3DCGエンジニア(正社員)|募集職種一覧|採用情報|株式会社ドワンゴ

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

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

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

1 comment:

Anonymous said...

なかなか不完全型入りませんね。先行してライブラリー案はあるのでそれを形にして息抜きしたいです。
それはそれとして、3DCGエンジニアですか。
自分もニコニ立体にいくつか上げていますが、まだ初心者レベルでガチにはなれそうにないです。
しぇーだーの研究をしたいとは思っているのですが、
ウィンドウズのプログラミングが下手なもので環境を整えるまでには至っていません。
そんなこと思ってたら時代に負けそうになってます。
DXもGLも独自実装もなんか決め手がないんですよね。
MSの今度のユニバーサルバイナリには期待してます。
おっと、余談が過ぎましたね。

そろそろニートやめないといけないのですが、どっか雇ってくれないですかねー。
ただの実績もない高卒ではなかなか・・・。Orz