本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

[[deprecated]]の文面の疑問点

[[deprecated]]の解説を書くためにCC++14の文面を解釈していて、以下のような疑問を持った。

§ 7.6.5 paragraph 2

The attribute may be applied to the declaration of a class, a typedef-name, a variable, a non-static data member, a function, a namespace, an enumeration, an enumerator, or a template specialization.

テンプレートの特殊化(template specialization)という用語の使用がとても気になる。

何故ならば、テンプレートの特殊化の宣言というものは、明示的なテンプレートの特殊化ぐらいしか思いつかないからだ。通常のテンプレートの特殊化は、暗黙のテンプレートの実体化された結果であり、宣言は存在しない。プライマリーテンプレートの宣言はテンプレートの宣言であり、テンプレートの特殊化の宣言ではない。

すると、テンプレート宣言にはdeprecated属性が使えないのだろうか。

「テンプレートの特殊化」という用語を使用することのもうひとつの問題は、template-idに限定してしまうということだ。template-nameはテンプレートの特殊化ではない。

// テンプレートの特殊化の宣言ではないが
template < typename T >
class [[deprecated]] A { } ;

template < template < typename > typename T >
class B { } ;

// 警告
// template-idはテンプレートの特殊化
A<int> ;

// 警告なし
// template-nameはテンプレートの特殊化ではない
B<A> b ;

現在のClangの実装は、正しく(?)A<int>とB<A>のどちらとも警告を出さない。GCCはどちらとも警告を出す。

こういう細かい文面解釈の問題が気になってしまってなかなかC++14解説の執筆が進まない。

ドワンゴ広告

この記事はドワンゴ勤務中に書いた。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0