C++0x

auto によって束縛される変数の型(解答・解説編)

http://d.hatena.ne.jp/gintenlabo/20110220/1298187803の解答と解説です。

auto によって束縛される変数の型(出題編)

追記: 問題を追加して整理しました。 コメントにあった auto && に関しては、また後ほど触れたいと思います。 問 C++0x において、以下のコード int f(); int& g(); int&& h(); int main() { auto x0 = 0; int i = 1; auto x1 = i; int const j = 2; auto x…

C++0x における NRVO

C++0x において、関数の戻り値に、関数内部のローカル変数を「そのまま」帰す場合を考えます: std::string f() { std::string s = "hoge"; return s; } この場合、戻り値として使われるローカル変数 s は、自動的に move されます。 つまり、以下のコードは…

std::pair の range access がいつの間にか規格から消えていた件

cpprefjp の std::pair の項目を下書きしてて気がついたんですが、 いつの間にか std::pair の Range Access が規格から消えていました: std::multimap<int, std::string> m = { { 0, "hoge" }, { 1, "fuga" }, { 1, "piyo" }, { 2, "foo" }, }; // equal_range のような イテ</int,>…

ラムダ式の参照キャプチャは基本的に安全である

ラムダ式ネタをもう一つ。こっちは少々マニアックな内容です。 C++0x におけるラムダ式は、 int f( std::vector<int> const& v1, std::vector<int> const& v2 ) { int sum = 0; auto add_to_sum = [&](int x){ sum += x; }; std::for_each( v1.begin(), v1.end(), add_</int></int>…

ラムダ式の型を取得する

C++0x から新たに C++ に追加された要素に、ラムダ式というものがあります。 これは、ちょっとした関数を、その場で定義して使えるようにしたもので、 #include <vector> #include <numeric> #include <iostream> int main() { std::vector<double> v = { -1, 2, 1.5, -4 }; double prod = std::</double></iostream></numeric></vector>…

C++0x 標準ライブラリ完全解説 〜 No.03 std::move_if_noexcept,

該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move_if_noexcept C++0x 標準ライブラリ完全解説の三回目です。 今回は解説することも少ないので、さっさと書いてしまうことにします。 …

C++0x 標準ライブラリ完全解説 〜 No.02 std::move,

該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move 少し間隔があいてしまいましたが、 C++0x 標準ライブラリ完全解説の二回目です。前回の記事では、 C++98/03 の時点から変わらない…

std::forward は Perfect Forward にのみ使われるとは限らない

http://d.hatena.ne.jp/gintenlabo/20110108/1294485577#c で、 #include <utility> template<class F, F f> class il_ptr_fun; template<class R, class... Args, R (*pf)(Args...)> struct il_ptr_fun<R (*)(Args...), pf> { typedef R result_type; R operator()( Args... args ) const { return (*pf)( std::forward</r></class></class></utility>

C++0x で関数へのポインタによるコールバックをインライン化する

お題 http://d.hatena.ne.jp/Cryolite/01000831#p1 を C++0x によって実現してみる。 解答1 Variadic Templates を使う。 #include <utility> template<class F, F f> class il_ptr_fun; // とりあえず関数ポインタだけ template<class R, class... Args, R (*pf)(Args...)> struct il_ptr_fun<R (*)(Args...), pf> { typedef R result_type; R ope</r></class></class></utility>…

C++0x 標準ライブラリ完全解説 まとめ

No.00 Introduction (2011-01-07 更新) No.01 namespace rel_ops, utility (2011-01-07 更新) No.02 std::move, utiliy (2011-01-16 更新) No.03 std::move_if_noexcept, utiliy (2011-01-17 更新) No.04 std::swap, utiliy (次回予定)

C++0x 標準ライブラリ完全解説 〜 No.01 namespace rel_ops,

該当規格: 20.3.1 Operators [operators], N3225 http://sites.google.com/site/cpprefjp/reference/utility/rel_ops さて、それでは早速、具体的なライブラリに移っていこうと思います。 とはいえ、初回から飛ばすのもアレなので、まずは軽いものを、 とい…

C++0x 標準ライブラリ完全解説 〜 No.00 Introduction

はじめに 現在 FDIS 制定に向けて着々と作業が進められてる C++ の次世代規格、通称 C++0x では、 今までの C++ で使いにくかった部分を、より便利に扱えるよう、様々な改良が行われています。 この改良は、言語コア部分の改良のみにとどまるものでは当然 な…

rvalue-reference で one-phase construction

前回の記事で説明したように、 auto p = std::make_shared<hoge>(); のような、「関数(あるいはコンストラクタ)の戻り値を変数に束縛する」コードは、*1 one-phase construction ではありません。 これはつまり、 struct person : private boost::noncopyable //</hoge>…

One-Phase Construction 入門 〜 Constructor run once.

導入 皆さんは C++ と聞いて、まず何を思い浮かべますか? 「C++? そんなの過去の遺物だろ? GC ないとか原始的すぎるじゃん?」 って思う人もいれば、 「いや、 C++ って無闇に複雑すぎて使えない。正直 C 言語で十分でしょ」 って人もいるでしょう。 が、…

Boost に std::unique_ptr の移植がないかな、と思ったら有った。

少し前に書いた記事 で紹介した std::unique_ptr の C++98/03 移植が Boost にないのはなんでなんだぜ、 と思っていたら、実は既にあったようなので、ここで紹介します。 Boost.Interprocess.UniquePtr Boost.Interprocess なんていう仰々しいライブラリに入…

C++0x の最新ドラフトが N3225 に

本の虫: post-Batavia mailiingの簡易レビュー C++0x の最新ドラフトが N3225 になったようです。 今回のドラフトにおける主な変更点ですが、 ユーザ定義のデストラクタ、ムーブ、コピーが存在する場合 暗黙のムーブは生成されない 暗黙のコピーは deprecate…

C++0x 版の俺々ライブラリを地味に開発中です。

Etude C++ Libraries: http://github.com/gintenlabo/etude 時代は C++0x ですよ奥さん。 // まだマトモに使えるものが存在しないけどな! // っていうかもう一つの俺々ライブラリは絶賛放置中だけどな!

ユーザ定義されたデストラクタを持つクラスのコピー自動生成が deprecated に

C++0xに素晴らしい変更が来たようです: 本の虫: C++0xにすごい変更が来た この変更により、初心者にありがちな間違いである、 class my_string { char* buf; public: my_string( char const* s ) { std::size_t const n = std::strlen(s); buf = new char[n…

C++0x の を C++98/03 の範囲で再現してみた

C++0x の で定義されている std::all_of 辺りが使いたかったので、 その辺を適当に実装したヘッダを作ってみました:http://gist.github.com/664418 実装した関数は以下の通りです: all_of any_of none_of find_if_not is_permutation copy_n copy_if is_pa…

C++03 で C++0x の std::max_align_t をシミュレートする

C++ において、データのアライメントというのは極めて大事な概念です。*1 しかし、今までの C++ の規格では、その辺りのコードに必要な情報を得るための方法が少なく、 移植性を意識したコードを書こうと思ったら、 Boost 辺りに頼らなければいけませんでし…

動的メモリ確保を行わない std::seed_seq を作ってみた。

C++0x の の話。 基本的なこととかは 本の虫: C++0xの新しい乱数ライブラリ、random を参照してください。 さて、上記の記事で登場している std::seed_seq ですが、 N3126 の 26.5.7.1 Class seed_seq によると、このクラスは内部に std::vector を保持して…

std::unique_ptr でスコープガード的な何かを作る

お題 当面のスコープガード - Faith and Brave - C++で遊ぼう のスコープガードを std::unique_ptr を使って実装してみる。 std::unique_ptr を使うことで、 release() によるキャンセルが可能になるし、 メモリ確保の回避や静的解析による最適化で、パフォ…

contextually converted to bool

結論から先に言いましょう。 C++0x では、 explicit operator bool を定義すれば、自動的に ! 演算子も使えるようになります: // getchar の戻り値とかで使えそうな何か struct hoge { hoge() : ch_(-1) {} hoge( char ch ) : ch( static_cast<unsigned char>(ch) ) {} exp</unsigned>…

reference collapsing

C++98 では「参照への参照」は作ってはいけないことになっていました: typedef int& ref_t; ref_t& ref = 〜; // 駄目。参照の参照は無理。 これは、基本的には、思わぬミスを防げるので 良い仕様と言えるのですが、 テンプレートを使うときに、思わぬコン…

N3126: 20.8.15 Class template hash の T* に対する特殊化がおかしい

Boost.Flyweight の発表するときの資料として規格を見ていた時に気づいたんですが、 C++0x の Working Draft (N3126) の 20.8.15 Class template hash の項目の、 template <> struct hash<T*>;の部分がおかしいです。 正しくは、 template <class T> struct hash<T*>;となっ</t*></class></t*>…

std::vector の shrink_to_fit

C++0x の std::vector には、新しく shrink_to_fit() メンバ関数が用意されています。 これは「 vector の確保しているメモリ領域を、その大きさに見合ったサイズまで縮小する」関数で、 典型的な使い方は、以下のような感じになります: // std::vector に…

本物の C++er はデストラクタを書かない

代わりに std::unique_ptr (あるいは boost::scoped_ptr )を使います. 何故か? struct hoge { hoge() : xxx( get_resource() ) { /* 処理 */ if( some_cond ) throw some_exception(); /* さらに処理 */ } ~hoge() throw(){ release_resource(xxx); } /*…

自己代入チェックについて

驚くべきことに,世の C++er の中には,未だに 「自前のクラスを作る場合は,忘れずに代入演算子を定義し,自己代入チェックをしなければいけない」 という考えを持った人がいるようです. http://d.hatena.ne.jp/nagoya313/20100706/1278428503 確かに,昔…

std::tuple のメタ関数と get をちょっとだけ改良する

C++0x から新たに標準ライブラリに加わった「任意個の値の組」を扱うクラス std::tuple には、 std::tuple_size と std::tuple_element という二種類のメタ関数が用意されています: #include <tuple> #include <string> #include <type_traits> // std::is_same int main() { typedef st</type_traits></string></tuple>…