最新のドラフトであるN3126では、14.7.3 Explicit specialization [temp.expl.spec]から、non-deletedという言葉が削除されている。これはつまり、以下のようなコードが書けるということを意味する。
// あらゆるインスタンス化の定義を削除 template < typename T > void g( T ) = delete ; // 削除されていない定義 template < > void g< double >( double ) { } void call_g() { g( 0 ) ; // エラー g( true ) ; // エラー g( 0.0 ) ; // OK }
関数gは、double以外の型でinstanciateされると、エラーとなる。
以前の文面では、deleted functionを明示的に特殊化することはできなかった。そのため、同じ事をしようとすれば、非テンプレートなオーバーロード関数を書くしかなかっただろう。C++0xでは、関数の明示的な特殊化ができる。そして、別にプライマリーテンプレートではdeletedな定義を、特殊化で定義するのは、特に問題はないと思われる。結局、同じことは非テンプレートなオーバーロード関数で行えるのだ。
No comments:
Post a Comment
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.