2011-04-13

いまだにどのコンパイラーも実装してない6年前に追加されたC++0xの新機能

以下のコードは、well-formedなC++0xのコードである。

template < void * = nullptr >
void f() { }

int main()
{
    f() ; // OK
    f<nullptr>() ; // OK
}

まず、function template parameterは、default argumentを取ることができるようになった。これは、gccがサポートしている。

また、non-type tepmlate argumentは、nullポインターに変換可能な定数式を取ることができるようになった(14.3.2 [temp.arg.nontype])。これは、どのコンパイラーも未だに実装していない。したがって、上記のコードは、現行のコンパイラーではコンパイルできない。

はたして、これは単に未実装なのか。しかし、関数テンプレートのデフォルト実引数は実装しているのに、これを実装していないというのは、忘れているんじゃないだろうか。gccにバグレポートすべきなんだろうか。

4 comments:

SubaruG said...

N3290 の 14.3.2/5 によると,今のドラフトだと f<0> は無理で,
f<(int*)0> と書く必要があるみたいです.

まぁ, GCC だと,どちらにせよ まだ未実装みたいですが.

江添亮 said...

おや、本当だ。
消しておこう。

Anonymous said...

> nullポインターに変換可能な定数式を取ることができるようになった
ここも少し不正確ですね。

0 の場合を含めて、通常の式中では null pointer conversion 経由で
ヌルポインタになるような式でも、 nullptr_t 型の式以外では
null pointer conversion が行われずテンプレート引数としては不正になると
されています。

江添亮 said...

それは、冒頭の文章を誤読した結果です。
正しくは、「null pointer valueと評価される定数式」ですね