C++で遊ぼう2013-06-04ムーブによるpopC++C++03のstd::queueとstd::stackがもつpop()メンバ関数は、要素型Tのコピーコンストラクタが例外を投げた場合に、削除がすでに済んでいるせいでコンテナが壊れてしまう、という例外安全性の問題があるために戻り値の型がvoidになっていました。C++11にはムーブとnoexceptがあるので、要素型Tが例外を投げないムーブコンストラクタを持っていれば、戻り値を返すpop()が書けるのではないかと思います。}}314aaabbbcccstd::queueを継承して作ったmovable_queue(名前がちょっと変ですが)には、move_pop()というメンバ関数を追加しています。この関数は、先頭要素をムーブによって取得したあと先頭要素を削除し、保持しておいた先頭要素をムーブによって返します(return文は自動的にムーブします)。要素型Tが例外を投げないムーブコンストラクタを持っていなければ、この関数は呼べないようにしておきました。問題ないように見えますが、まだ懸念事項を解決しきっていません。front()呼び出しの後にpop()が例外を投げると、やはり壊れてしまいます。キューが空であればfront()の時点でアクセス違反になる(未規定)ので、pop()まで来ないから問題ありません。それ以外で、pop()が例外を投げる可能性があるか調べ中。Writerロックで、並行キューを実装した。Librariesコントリビュータ。boostjp/cpprefjpサイトコアメンバ。blogBoost.Multi-Index作者ブログBoost.Asio作者ブログBoost.Geometry作者ブログBoost.Thread作者ブログboost.develWandboxはてなブログをはじめよう!faith_and_braveさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。