2011-01-01から1年間の記事一覧

gcc-4.6.0 がリリースされた

gcc の最新版 4.6.0 がリリースされたようです: http://gcc.gnu.org/gcc-4.6/ 気になる C++0x サポートですが、 g++ 4.6.0 では、新たに nullptr range-based for constexpr noexcept implicit move 等が追加されたようです。 http://gcc.gnu.org/projects/…

Boost.Optional Must Go (3)

関連記事: http://d.hatena.ne.jp/gintenlabo/20100531/1275335373 http://d.hatena.ne.jp/gintenlabo/20100602/1275505739 結論から言います。 以前の記事において、参照に対する Boost.Optional は、生ポインタの代替として使える、と書きましたが、 現状…

rvalue reference の不満点

C++0x には rvalue reference という機能があります。 これは「一時オブジェクトへの参照」を扱うものであり、 struct X { std::string s; // 一時オブジェクトが渡された場合、 s_ は自由に変更できる // なので、 s_ の中身を「移動」して s を初期化する …

Inheriting Constructors を Variadic Templates でエミュレートする

C++0x の規格制定において、 Inheriting Constructors を見直す提案がなされたようです: 本の虫: pre-Madrid mailingの簡易レビュー 曰く、 Inheriting Constructors (以下、 Constructor を Ctor と略記)は、 Variadic Templates でエミュレート可能であ…

Variadic Templates を SFINAE 用のダミー引数として使う

C++ では、ある関数に渡された引数の種類によって、実際に行う処理を切り替えたい時には、 #include <type_traits> template< class T, class = typename std::enable_if< std::is_integral<T>::value >::type > void f( T const& x ) { // T が整数型の場合 } template< cla</t></type_traits>…

関数テンプレートに対するデフォルトテンプレート引数の使い方

この記事は、新しい使い道が発見され次第、随時更新していく予定です。 はじめに C++0x では、関数テンプレートに対し、デフォルトのテンプレート引数を渡すことが出来るようになりました: http://d.hatena.ne.jp/faith_and_brave/20071105/1194259443 // …

Boost.勉強会 #4 で喋ってきました。

週末は Boost.勉強会 #4 に参加してきました。 なかなか興味深い発表が多かったので、興味ある方は http://d.hatena.ne.jp/osyo-manga/20110226/1298715364 辺りを参照してみるといいんじゃないでしょうか。 んで、一応僕も Boost.Optional について話してき…

range-based for

C++0x の規格制定で、範囲 for 構文をどうするかが議論になっているようです。 本の虫: range-based forに対する意見求む range-based for の変更案 - Togetter 僕としては、案4の「メンバ関数を呼び出す」が妥当かと思います。 というのも、 ADL というの…

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++ で使いにくかった部分を、より便利に扱えるよう、様々な改良が行われています。 この改良は、言語コア部分の改良のみにとどまるものでは当然 な…

新年あけましておめでとうございます。

今年が C++ にとって良い年でありますように。 2010年 元旦 銀天すばる