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:

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

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

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

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

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

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.