以下のコードは、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にバグレポートすべきなんだろうか。
N3290 の 14.3.2/5 によると,今のドラフトだと f<0> は無理で,
ReplyDeletef<(int*)0> と書く必要があるみたいです.
まぁ, GCC だと,どちらにせよ まだ未実装みたいですが.
おや、本当だ。
ReplyDelete消しておこう。
> nullポインターに変換可能な定数式を取ることができるようになった
ReplyDeleteここも少し不正確ですね。
0 の場合を含めて、通常の式中では null pointer conversion 経由で
ヌルポインタになるような式でも、 nullptr_t 型の式以外では
null pointer conversion が行われずテンプレート引数としては不正になると
されています。
それは、冒頭の文章を誤読した結果です。
ReplyDelete正しくは、「null pointer valueと評価される定数式」ですね