2011-03-30

gcc 4.6のconstexprバグ

gcc 4.6では、以下のコードがエラーになる。

struct X
{
    constexpr X() { }
    constexpr X f( X x ) { return x ; }
} ;

このコードは、well-formedである。なぜならば、クラス型は、クラス定義の内部では不完全型であるが、戻り値や仮引数の型では、完全型であるとみなされるからだ。9.2 Class members [class.mem] paragraph 2

このバグを26日に発見したので、報告したところ、29日に修正された。gcc 2.6.1はこの修正を含むそうだ。

Bug 48296 – [C++0x] constexpr member function cannot use the class type it belongs as parameter type or return type

しかし、何で私が実際に何かコードを書こうとするたびに、コンパイラーのバグに出くわすことになるのか。

constexpr constructorを使った、短いコード例を考えているが、特に思いつかない。関数はともかく、クラスオブジェクトをコンパイル時定数にできるというのは、なにか面白そうな例が思いつきそうなのだが、どうも出てこない。困ったものだ。

No comments: