2014-12-04

2014-10-pre-Urbanaのレビュー: N4240-N4249

N4240: Improved insertion interface for unique-key maps (Revision 2)

std::mapとstd::unordered_mapにある要素の挿入あるいはemplaceするとき、すでに要素が存在する場合は、挿入やemplaceが行われない。しかし、以下のような問題がある。

std::map< int, std::unique_ptr<T> > m ;
m[0] = nullptr ;
auto ptr = std::make_unique<T>() ;
m.emplace( 0, std::move(ptr) ) ; // ムーブされるかどうかは未規定

bool b = ( ptr == nullptr ) ; // 結果は未規定

上記の例で、emplaceはすでにキーに対応する要素が存在するので、行われない。しかし、ライブラリの実装次第によっては、ムーブが行われる可能性がある。規格はこの挙動を規定していない。

N4240は、挙動の規定された新しいメンバーを追加しようという提案だ。

  • try_emplaceは、キーが存在する場合、何も挿入せず、ムーブも行わない。
  • insert_or_assignは、キーが存在しない場合は挿入し、存在する場合は代入する
std::map< int, std::unique_ptr<T> > m ;
m[0] = nullptr ;
auto ptr = std::make_unique<T>() ;

// 戻り地はpair<iterator, bool>
auto result = m.try_emplace( 0, std::move(ptr) ) ; // 何もしない。ムーブemされない

bool b = ( ptr == nullptr ) ; // false

result.first ; // キーに対応する要素へのイテレーター
result.second ; // false, 挿入が行われたかどうか。

N4241: A proposal to add shared_mutex (untimed) (Revision 3)

従来のshared_mutexはtimed lock要求を満たすため、shared_timed_mutexに解明されたことを受けて、timed lock要求を満たさないshared_mutexの提案。

N4242: Executors and Asynchronous Operations, Revision 1

スレッドプールなどの方法で細かいタスクを並列実行するライブラリの設計の提案。N3785とは違い、だいぶ軽い設計になっている。

N4243: Networking Library Proposal (Revision 2)

Boost.Asioを土台にしたネットワークライブラリの提案。

N4244: Resumable Lambdas: A language extension for generators and coroutines

resumable lambdaの提案。

N4245: C++ Standard Library Active Issues List
N4246: C++ Standard Library Defect Report List
N4247: C++ Standard Library Closed Issues List

標準ライブラリに持ち上がっている既知の問題、修正済みの問題、却下された問題の一覧。

N4248: Library Preconditions are a Language Feature

関数の実引数に対して、呼び出し側が満たすべき前提条件を記述できるコア言語の文法が必要であるとする提案。

まだ具体的な文法は定まっていないが、なぜ前提条件のチェック、制約が必要なのかや、既存の例について長文で考察している。

N4249: Networking Primitives: std::experimental::network::htonl Considered Harmful

N4023はhtonl, ntohl, htons, ntohsというライブラリを提案している。これはかの有名なバークレーソケットAPIと同じように機能する。すなわち、バイトオーダーの変換を行う。

問題は、既存の実装は、大方がプリプロセッサーマクロで提供されているということだ。C++の標準ライブラリに同名の関数を持ち込むと、既存のコードと衝突する。標準C++をサポートするための移行にかかる労力は非現実的なものとなる。

N4249は、標準ライブラリでhtonlのような名前を使うのをやめるべきであると提案している。

かなしい。

ドワンゴ広告

この記事はドワンゴ勤務中に書かれた。

最近、社内にポータルができつつある。

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

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

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

2 comments:

Anonymous said...

エンディアン変換関数は、LittleToBigとBigとBigToLittleとThisComputerToLittleとLittleToThisComputerと ThisComputerToBigとBigToThisComputerとが欲しいですね。
ThisComputerは処理系依存ですけど。
以前所要でSHA256のコード書いていた時にエンディアン変換のコードが必要になって投げたんですけど標準であってほしいです。
あと、IsBigとIsLittleもあればいいですね。

Anonymous said...

エンディアン変換関数は、LittleToBigとBigToLittleとThisComputerToLittleとLittleToThisComputerと ThisComputerToBigとBigToThisComputerとが欲しいですね。

誤字ってました。失礼しました。