2008-08-22

コンセプトについてDouglas Gregorに訊ねてみた

C++0xのコンセプトがいまいちよく理解できなかったので、ConceptGCCのメーリングリストに疑問を投げてみたところ、Douglas Gregor本人が答えてくれた。

ConceptGcc mailing archive page

奴は間違いなく頭がいい。まあ、他ならぬDouglas Gregorなのだから、Conceptに関して詳しいのは当然だが、頭がいい。

associated fucntionのdefault implementationはconstrained templateである。翻訳になってないが、これ以上に翻訳できないのだから仕方がない。

14.9.1.1.10
A default implementation of an associated function is a constrained template (14.10).

よって、次のコードはill-formedである。

auto concept Foo< typename T >
{
    void func( T & x )
    { x.func() ; }// ill-formed!
}

なぜならば、デフォルト実装の中でも、当然のごとくコンセプトとして振舞うからだ。然るに、T::func(void)が要求されていない以上、使うことはできない。

auto concept Foo< typename T >
{
    void T::func() ;// これでコンパイルできる
    void func( T & x ) { x.func() ; }
}

また、コンセプトでは、メンバ変数を要求することはできない。したがって、デフォルト実装の中でメンバ変数を使うことも、また不可能である。このようなメンバ関数を呼び出す非メンバ関数のデフォルト実装ができないと、わざわざすべてのクラスに、非メンバ関数を書くか、concept_mapで定義しなければならないので面倒ではある。

しかし、考えていれば、もしコンセプトが広く使われるようになったならば、プログラマはコンセプトのために、非メンバ関数を用意するのが主流になるから、たぶん大丈夫だろう。

No comments: