C++

括弧で囲みたい。

括弧で囲みたいんだけど、なんかエラーが出る。GCCのバグっぽい。 再現できる最小のコード struct foo { int operator[](int) const { return 0; } }; int main() { (foo ()[0]); return 0; } 現在とっている回避法。 int main() { (0,foo ()[0]); // 現在使…

switchで文字列を使いたい

C++ではできないので、マクロを使ってでっち上げる。 namespace ns_switch { template<class C> const C* select(const char* str, const wchar_t* wcs) { return str; } template<> const wchar_t* select<wchar_t>(const char* str, const wchar_t* wcs) { return wcs; } tem</wchar_t></class>…

C++0x Working Draft N2461

C++

ざっとみたところ ヌルポインタ定数 nullptr raw string literal メンバ関数の参照修飾(でいいのかな?) 明示的な変換関数(explicit付きの変換関数) アトミック操作(29章) 文字コード変換(ヘッダ) が入っている。

C++0x ラムダ式に対する雑感

C++

最新のproposalはこれか? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2413.pdf <>(引数リスト)(式) <>(引数リスト)->戻り値の型{ 関数本体 } とか書けるのか。 『<>』を『』にするとローカル変数にアクセスできるのね。 しかし、『<>』『』…

クラス名と同じ名前のメンバ

C++

http://d.hatena.ne.jp/uskz/20071002/p1より へぇ〜。コンストラクタをもたないクラスは同名の非静的メンバをもてるんだ。 struct foo { int foo; // foo(){} // ~foo(){} }; VCとdmcでは、コンストラクタをもたなくても、コンパイルエラーになる。 Watcom…

条件演算式の型

C++

C++では、第2項と第3項の型が同じで共に左辺値であるなら条件演算式は、左辺値であることは、比較的よく知られていると思うが、 第2項と第3項が共に配列型 又は 関数型である場合、ポインタ型への変換は行われないのね。 完全に規格を見落としていた。 早速…

共変の戻り値型

東方算程譚 こばりあんすより、 私も書いてみた。 class VB { public: virtual VB* create() { return new VB; } }; class LB:public virtual VB { public: virtual LB* create() { return new LB; } }; class RB:public virtual VB { public: virtual RB* c…

テンプレートに依存する型名のusing宣言

少し前に、テンプレートに依存する型名のusing宣言の書き方が分からなくて、色々試していた。 template <class T> struct bar { typedef T type; }; template <class T> class foo:bar<T> { using typename bar<T>::type; // (1) やりたかったこと typedef typename bar<T>::type type; </t></t></t></class></class>…

C++0x ヘッダ

C++

C++0xのドラフトを眺めていたら、ヘッダの中に以下の記述を発見 namespace std { ... template<class T> complex<T> fabs(const complex<T>&); ... } おいおい、fabsの戻り値はTだろ。何も考えずに、コピペで規格作るな。 ところで、C99にある『cproj』関数はサポートされな</t></t></class>…

Open Watcom

Version 1.7が出たみたい。とりあえずダウンロードしよう。

C++0x ヘッダ

C++

ヘッダのなかに enum posix_errno { ... invalid_argument = EINVAL, ... }; 列挙定数invalid_argumentを発見。 えーと、C++標準化委員会のみなさん、ヘッダのなかにinvalid_argumentというクラスがあるんですけど。 クラス名と、列挙定数などの名前が同名で…

C++0x

C++

C++0xの新しいドラフトが公開されている。 ざっと見たところ、 アライメントのサポート(alignas,alignof) decltype constexpr Strongly Typed Enums Defaulted and Deleted Functions などが追加されている。 最後の奴 class foo { foo() = default; foo(con…

右山括弧

http://cmeerw.org/prog/freecpp/より いつの間にか、C++0xの右山括弧の構文 vector<vector<int>> a; // >と>の間に空白がない。 に対応していたのね。VC8とGCC4.3が対応していたのは知っていたが、 Watcomは、インストールしたものの、ほぼ未使用でチェックしていなかっ</vector<int>…

decltype

GCCにdecltypeが実装された。 http://gcc.gnu.org/ml/gcc-patches/2007-07/msg01848.html http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2115.pdf typeofとの違いは参照に対する振る舞いの違いでいいんだっけ。 int i; int& j = i; decltype(j)…

クラス名を重ねる

C++

コピペミスでクラス名を重ねてしまった。 以下、単純化したサンプル struct foo { static const int bar = 2; }; int main() { cout << foo::foo::bar << endl; return 0; } VCでは、エラーが出たが、GCCでは、警告も出ずに通ってしまった。 どうやら、valid…

混ぜるな危険

C++

GCCやVCはメンバへのポインタをメンバにもつPOD型を正しくゼロ初期化してくれない。 #include <cassert> struct foo { int mem1; int foo::* mem2; }; int main() { foo x = {0}; assert(x.mem2 == foo().mem2); return 0; } 対応策 POD型の構造体のメンバにはCにない</cassert>…

右辺値参照

GCCの本流に右辺値参照の機能が追加された。 http://gcc.gnu.org/ml/gcc-patches/2007-05/msg02120.html めでたい。

C++0x

C++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2284.pdf 最新ドラフトが公開されている。 主な新機能は 可変個テンプレート テンプレートの別名 新しい文字型(char16_t, char32_t) あたりかな。 後で、じっくり読もう(英語苦手で詳しく読めない…

ConceptGCC 4.3.0 alpha 6

C++

http://www.generic-programming.org/software/ConceptGCC/ ConceptGCCの新しいversionが出たみたい。 concept以外にもC++0xの面白そうな新機能がいっぱい実装されている。 Rvalue references Right angle brackets Default template arguments for function…

本日のバグ

以下のコードがVCでコンパイルできねぇ! #include <cstddef> struct A { int x,y; }; template <class X> struct C { int x :offsetof(X,y); }; int main() { C<A> x; } こんなコード書くなよ。>俺</a></class></cstddef>

任意の型、個数の引数を受け取るmax revison 2

C++

signedとunsignedを渡したときの動作を直感に合うようにしたり、 文字列や配列などを引数にできるようにするなど、いろいろ修正 struct gless { typedef bool result_type; template <typename T, typename U> bool operator() (const T&a, const U&b, typename boost::enable_if<is_signed<T> >::</is_signed<t></typename>…

template typedef

C++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2112.pdf テンプレートの別名を付けるのは、typedefじゃなくて、usingを使うのね。 template <typename T> using Vec = vector<T>; using int32_t = int; // typedefの代わりにも使える。 別名は、型名じゃなくて</t></typename>…

C++0x concept

C++

where → requires キーワードが変更されたのね。 エディタの強調設定修正

任意の型、個数の引数を受け取るmax

C++

struct gless { typedef bool result_type; template <class T, class U> bool operator() (const T&a, const U&b) const { return a < b; } }; template <typename... T> struct vmax_t; template <typename T> struct vmax_t<T> { typedef T type; }; template <typename T, typename... U> struct vmax_t<T,U...> { type…</t,u...></typename></t></typename></typename...></class>

ビットフィールドの型

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30328 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30332 ビットフィールドを使うと地雷踏みまくり。 最近、ビットフィールド関連のバグを合わせて五つほど報告。 ビットフィールドはバグを避けて使うのは難…

ビットフィールド

多分大丈夫だと思ったけど通常使わないビットフィールドの使い方をしてみた。 予想に反し、GCCはバグっていた。http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30274 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30277回避策 なし。こんな間抜けな使い方す…

サイズ不明の配列へのポインタを引数に取る関数:定義編。

http://d.hatena.ne.jp/sulpsulpc/20061125では宣言する方法のみだったので、今回は定義する方法。 #include template struct P { typedef R func(A*); }; P>::func foo; template struct I { friend R foo(A* x) { X y= *x; std::cout ; template struct I,…

Open Watcom Version 1.6

http://www.openwatcom.org/

Visual Studio 2005 Service Pack 1

http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2005/sp1/ とりあえずいれておく。

クラステンプレート内でのフレンド関数定義

ここを見て、日記を書いていられる方を見かけたのでちょっとだけ解説。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19809で示されているサンプル #include template struct n{ friend void foo(){ std::cerr n1; n n2; n n3; foo(); } Reporterの方は、規…