C++0x の std::vector には、新しく shrink_to_fit() メンバ関数が用意されています。 これは「 vector の確保しているメモリ領域を、その大きさに見合ったサイズまで縮小する」関数で、 典型的な使い方は、以下のような感じになります: // std::vector に格納される要素数の見当がつけられない // が、「上限」は分かる。このとき余計な領域の再確保を避けたい std::size_t const limit = 〜〜; // vector に格納される要素の上限 std::vector<T> vec; // まず上限までメモリ領域を確保する vec.reserve( limit ); // vec に格納していく // ... // 格納終了。しかし、 // このままだと巨大なメモリ領域を占有してしまうので、 // vec の確保している領域を「 s
もうconstexprについていく自信がない。現在、文面にバグがあるので議論されている最中だが、どうも、本来の意図する定義では、以下のようなことができるはずである。 constexpr int f() { return 1 ; } constexpr int g() { return 2 ; } constexpr int h() { return 3 ; } constexpr int (*table[])(void) = { &f, &g, &h } ; constexpr int call( int i ) { return table[i]() ; } これは、ジャンプテーブルをコンパイル時に構築して、コンパイル時に実行するコードである。 また、initializer_listを、constexpr対応させようという意見もある。現在、initializer_listは、conste
訳者注 下記の文章は C++0x - the next ISO C++ standard の暫定勝手和訳です。 翻訳は現在進行中であり、未完成かつ不正確である可能性があります。 っていうか未完成かつ不正確です。 正しい情報を必要とされる方は、原文を当たってくださいますようよろしくお願いします。 誤訳の指摘は大歓迎です。 2010年01月06日更新 (訳注: 和訳は2010年01月21日更新) この文書 (訳注: 原文) は Bjarne Stroustrup が記述、更新している。 建設的なコメント、訂正、参考資料、提案はもちろん大いに歓迎する。 現在、著者は参考資料の充実化と清書に取り組んでいる。 C++0x は次期 ISO C++ 標準である。 現時点の 草案 を、コメント募集のため公開している。 以前の (そして現在の) 標準は、しばしば C++98 や C++03 と呼ばれる; C
C++03 には、 map::operator[] const がなくて 切実にほしかったのですが、 C++0x では map::at メンバ関数が追加されるようです。 namespace std { template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T> > > class map { public: ... // 23.3.1.2 element access: T& operator[](const key_type& x); T& operator[](key_type&& x); T& at(const key_type& x); const T& at(const key_type& x) const; ... }; } uno
C++0x では、Scoped Allocator Model というネストしたコンテナ(stringのvectorとかlistのmapとか)の メモリ割り当てとして、コンテナとコンテナの各要素のアロケータを指定できるようになります。 以下は、vectorの例: Scoped Allocator Model のために、 std::scoped_allocator_adaptor というクラスが提供されます。 namespace std { template <Allocator OuterA, Allocator InnerA = unspecified allocator type> class scoped_allocator_adaptor; } 使用例: 指定した領域から alloc するような Scoped allocator を作成する class SimpleArena {
C++0x では、各コンテナに emplace/emplace_back/emplace_front/emplace_hint というメンバ関数が追加されます。 こういうクラスがあった場合 struct something { something(int, int, int); }; something をコンテナの要素として追加する場合、 C++03 では以下のようにしていました。 vector<something> v; v.push_back(something(1, 2, 3)); この方法では、 something のコンストラクタによる一時オブジェクトの生成と、コピーのコストが発生します。 Placement Insert では、可変引数テンプレートによって要素型のコンストラクタ引数を受け取ることで 要素をコンテナ内で一度だけ生成し、コピーのコストをなくします。 vector<
まず始めに明言しておくと、lambda式でデータメンバーはキャプチャーできない。lambda式は、ローカル変数しかキャプチャできない。従って、このブログのタイトルは、すでに間違っている。ではなぜこんなタイトルなのか。それは。lambda式では、データメンバーを使うことが出来るからだ。これは、誤解されやすい。 struct C { int x ; void f() { [=]{ return x ; } ; } } ; これは、完璧にwell-formedなC++0xのコードである。ご覧のように、データメンバーが使える。「ほれ見ろ使えるじゃねぇか。するてぇと、データメンバーもキャプチャーできるに違ぇねぇ」と思われるかもしれない。しかし、データメンバーは、キャプチャーできない。 では、このlambda式は、何をキャプチャーしているのか。thisである。上の例は、以下のように書くこともできる。
ふときがつくと、noexcept operatorなるものが追加されていた。これは、オペランドの式が、例外を投げそうな式を含む場合、falseを返す演算子である。結果はもちろん、定数だ。つまり、メタプログラミングに使える。オペランドの式は、評価されない。 void f() noexcept; void g() ; noexcept( f() ) ; // true noexcept( g() ) ; // false noexcept( throw 0 ) ; // false // ポリモーフィック型 struct Base { virtual void f() {} } ; struct Derived : Base { } ; Base base ; noexcept( dynamic_cast<Derived &>(base) ) ; // false noexcept( type
C++0xが09年までに正式制定が出来ず、先送りになったことは皆さんも御存知だと思います。どういう裏事情があったのか、部外者である私は知りませんし、関心もありません。いいものを作り上げるためにじっくりとやってもいいと思います。 ただ一つだけ言いたいことは、moveコンストラクタだけはもっと早い時期に切り離して、出来れば部分的改訂のC++03に盛り込んで欲しかったという気持ちがあります。少しでも大きなオブジェクトを扱うアプリケーションをC++で書いた経験のある人ならお分かりでしょうが、コピーの高い代償には本当に悩まされて来たものです。極端なことを言えば、効率性(実行速度及びメモリ使用率)重視でなければ、あんな難しいC++言語を使うのは阿呆らしいです。ですから、コピーコンストラクタを出来得る限り走らせないよう、工夫しながら書くのは非常なストレスを感じます。しかも、殆どの場合、コピーコンストラク
ラムダ式によって生成される関数オブジェクトを、同じシグネチャを持つ関数ポインタへ変換できるようになります。 Windows APIやOpenGLのようなCライブラリとの互換性のための機能ですね。 #include <GL/gl.h> #include <GL/glut.h> int main(int argc, char* argv[]) { glutInit(&argc, argv); glutCreateWindow("Title"); glutDisplayFunc([]{ glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0, 0.0, 0.0); glBegin(GL_POLYGON); glVertex2d(-0.5, -0.5); glVertex2d(0.5, -0.5); glVertex2d(0.5, 0.5); glVertex2d(
かなり前から提案は出ていましたが、N3090のWorking Draftから、 暗黙に定義される特殊メンバ関数に、ムーブコンストラクタとムーブ代入演算子が追加されることになりました。 つまり、以下のようなクラスがあった場合、 struct X { std::string s; }; Xは以下のようなメンバを持つクラスになります。 struct X { std::string s; X() : s() {} // デフォルトコンストラクタ X(const X& x) : s(x.s) {} // コピーコンストラクタ X(X&& x) : s(static_cast<std::string&&>(x.s)) {} // ムーブコンストラクタ // : s(std::move(x.s)) {} X& operator=(const X& x) { s = x.s; return *this;
Variadic Templatesである。Variadic Templatesとは、そもそも何か。 Variadic functionというものがある。最も身近な例は、printfである。 int printf ( char const * format, ... ) ; printf( "number: %d, string: %s", 123, "hello" ) ; このように、任意の数の引数をとることができる関数を、Variadic functionという。 Variadic Templatesは、任意の数の、テンプレート引数を取れるテンプレートである。 これまで、型安全に任意の数の引数を取る方法はなかった。もちろん、関数はオーバーロードできる。 template < typename T1 > T f( T1 const & t1 ) ; template < typename
C++0x で新しく追加されるユーザ定義リテラルはアンダースコアから始まってないとダメという制約がありますが、これがコンパイル時に問題にならないということは hito さんが書いています(本の虫: user defined literalが予約語の制約を無視できる理由)。 でもコンパイル時じゃなくてプリプロセス時ならどうなるの?という話です。 アンダースコア二つから始まる名前と、アンダースコアひとつに大文字から始まる名前は、当然プリプロセス時にも影響してきます。 ということは、 #define __hoge hage というのをコンパイラが予約していた場合、 "bjarne"__hoge というのをユーザが書いた場合、プリプロセス時に __hoge が置換されてしまって、意図しない結果になりそうです。 これは問題だなーとか思っていて、ぼけーっと仕様書を眺めていたのですが、こんなのを見つけま
本WIKIは現在仕様策定中の C++0x 言語仕様書の翻訳を、こっそりと堂々行うサイトです。 当WIKI内の内容はあくまでヽ(゚∀。)ノうぇねが私的に行ったものであり、なんら正式に書式化されたものではありません。かなり翻訳として怪しい内容もありますので、基本的には原文の補助として参照してください。 また、内容的におかしな場所、言葉、不適切な用語があれば、指摘ください。 現在の作業対象は仕様書草案 N3035 を基準に行っています。 力尽きたら、そっとページを閉じて見なかったことにしてください。 JTC1/SC22/WG21 C++ 標準化作業グループ コメント欄 タイトルは現状 N3000 をベースに作成しています。順次、N3035 に移行します。 -- ヽ(゚∀。)ノうぇね? 2010-03-13 (土) 23:07:43 お、誰か参加してくれている! ありがとうございます。 -- ヽ(
追記:寄付のおかげで形になるまで執筆が続けられました。本の虫: C++11参考書の公開:C++11の文法と機能 私のC++0x本の執筆活動のため、寄付をお願いします。 Paypal経由での寄付も受け付けています。通貨単位は、日本円(JPY)に設定しています。 [終了] 説明 私は今、C++0xの参考書を執筆している。この本は、C++0xの新機能はもちろんのこと、既存の参考書で、なかなか説明されることがなかった、名前探索(Name lookup)や、オーバーロード解決(Overload resolution)、テンプレートのインスタンス化(Instantiation)と依存名(Dependent name)といった、言語の規格上の定義を、詳しく説明する本になる。また、日本人の手によって書かれた本としては、おそらく初めて、規格を参考にして書かれる、総合的な参考書となるはずだ。 私は、既存の日本
江添亮 自由ソフトウェア主義者 C++ Evangelist C++標準化委員会の委員 ドワンゴ社員 C++11本を執筆した。 株式会社ドワンゴで働いている。 Mail:boostcpp@gmail.com Twitter:@EzoeRyou GitHub: https://github.com/EzoeRyou 江添亮のマストドン@EzoeRyou 筆者にブログのネタを提供するために、品物をアマゾンお気に入りリスト経由で送りたい場合: Amazon.co.jp: 江添亮: 江添のほしい物リスト 筆者にブログのネタを提供するために、直接に品物を送りたい場合、住所をメールで質問してください。 View my complete profile ► 2020 (31) ► December (2) ► November (2) ► September (2) ► August (4) ► Jul
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く