タグ

2011年7月29日のブックマーク (7件)

  • auto指定子の型の推定方法

    autoな変数の型は、代入の式になる。そう言ってしまうのは、単なる一ユーザーである。いやしくもプログラミング言語学者(language lawyer)を自負している以上、auto指定子が、どうやって初期化子の式から、変数の型を推定するのかということを、厳密に知らなければならない。 実際、以下のコードをみれば、「変数の型は初期化の式になる」というのが、不完全な説明であるのは理解できるだろう。 int const a = 0 ; // aの型はint const auto b = a ; // bの型はint auto const c = a ; // cの型はint const auto const & d = a ; // dの型はint const & しかし、この型の推定方法は、何かに似ている。そう、まるでテンプレートの実引数の型を推定しているようだ。まさにその通りである。auto指定

  • 本の虫: auto指定子の落とし穴

    auto指定子では、他の指定子や宣言子を組み合わせることができる。 int x = 0 ; int & ref = x ; ここで、宣言子がrvalueリファレンスの場合、注意を要する。 int main() { int x = 0 ; int && r1 = x ; // エラー、rvalueリファレンスをlvalueで初期化できない auto && r2 = x ; // OK、ただし、r2の型はint & auto && r3 = std::move(x) ; // OK、r3の型はint && // false std::is_rvalue_reference< decltype(r2) >::value ; // true std::is_rvalue_reference< decltype(r3) >::value ; } なぜならば、auto指定子の型は、template a

  • C++0xとC++03の比較

    2ch.netC++0xスレのために書いたコードを、試しに、C++03に移植してみた。 まずは、C++0x版から。 #include <iostream> #include <vector> // range_traits案の実装 namespace std { template<class T> struct range_traits { static auto begin( T & t ) -> decltype( t.begin() ) { return t.begin() ; } static auto end( T & t ) -> decltype( t.end() ) { return t.end() ; } static auto begin( T const & t ) -> decltype( t.begin() ) { return t.begin() ; } st

  • 本の虫: rvalue reference 完全解説

    目的 この記事は、C++0xのrvalue referenceを完全に解説せんとする目的を以て書かれた。サンプルコードは最小に留め、エラー処理等は省いた。この記事さえ読めば、今日からrvalue referenceを恐れることなく使う物のC++0xプログラマになれるだろう。 lvalueとrvalueについて Cの時代では、lvalueとrvalueの違いは、代入演算子の左側か右側かという違いだけであった。つまり、left hand value, right hand valueの略である。従って、訳語も、左辺値、右辺値であった。C++においては、これはもはや正しくはない。従って、右辺値、左辺値というのも、誤訳である。それ故に、ここでは、これ以上、左辺値、右辺値という名称を使用しない。 誤解を恐れずにいえば、lvalueとは、明示的に実体のある、名前付きのオブジェクトであり、rvalue

  • C++0x typeof - Faith and Brave - C++で遊ぼう

    decltypeでこれできるかな decltypeでmapのvalue_typeを取得する方法 インスタンスからメンバの型を取得する いろいろ試した結果、これはわりと必須かもしれない typeof.hpp #ifndef TYPEOF_INCLUDE #define TYPEOF_INCLUDE #include <utility> #define typeof(X) std::identity<decltype(X)>::type #endif // TYPEOF_INCLUDE #include <iostream> #include <string> #include <map> #include "typeof.hpp" using namespace std; int main() { map<string, int> dict; dict["Akira"] = 23; dict

    C++0x typeof - Faith and Brave - C++で遊ぼう
    mEGGrim
    mEGGrim 2011/07/29
    decltype(v)::iteratorが駄目な理由
  • CUDAアトミック関数 - PukiWiki Plus!

    アトミック関数 あるスレッドがグローバルメモリやシェアードメモリ上のデータを読み込み,修正し,書き込む(read-modify-write)という一連の処理を行うとき,その処理中にそのメモリ領域に他のスレッドが書き込みが行われないようにしたい場合があります.CUDAにはこれを保証するアトミック関数が用意されており,32bitまたは64bitワード長のread-modify-write操作中に他のスレッドからの干渉を防いでくれます. CUDAのアトミック関数はその名前がatomicから始まっているのでわかりやすいと思います. また,signed integerとunsigned integerのみ対応しています(atomicExch()を除く). 各関数は引数として,intもしくはunsigned intのアドレスと値を取ります (atomicExch()はfloatも,atomicInc

  • Boost.PropertyMap (.pdf)

    2010/10/23 Boost.勉強会 #3 関西 プレゼン資料 .pdf とりあえず upload 版Read less

    Boost.PropertyMap (.pdf)