C++14の新機能: [[deprecated]] 属性
[[deprecated]]属性とは、C++11で追加された属性の文法で指定できる機能である。
deprecated属性は、任意の名前やエンティティに指定できる。deprecated属性を指定された名前やエンティティは、依然として通常通り使用できるが、使用が非推奨になる。
[[deprecated]] int handy_global_variable ;
int main()
{
handy_global_variable ; // 非推奨
}
deprecated属性には、文字列リテラルを記述することもできる。
[[deprecated("Don't Use It!")]] int g ;
deprecated属性は、クラス、typedef名、変数、非staticデータメンバー、関数、enum、テンプレートの特殊化に対して指定できる。それぞれの属性を記述する文法は以下の通り。
// クラス
struct [[deprecated]] Class ;
// typedef名
[[deprecated]] typedef int typedef_name ;
// エイリアス宣言
using alias [[deprecated]] = int ;
// 変数
[[deprecated]] int variable ;
void f( [[deprecated]] int param ) ;
// 非staticデータメンバー
// staticデータメンバーは変数に含まれる
struct X
{
[[deprecated]] static int data ;
} ;
// 関数
[[deprecated]] void function() ;
// enum
enum struct [[deprecated]] Enumeration { E } ;
// テンプレートの特殊化
template < typename T > struct Y { } ;
// Y<int>のみdeprecated
template < >
struct [[deprecated]] Y<int> { } ;
若干属性の文法がわかりにくいのは、クラスとenumとエイリアス宣言だろうか。
さて、規格上の解説はここまでで終わりだ。ここからは、規格外の解説になる。deprecated属性は、名前を非推奨だとマークできる機能だ。その情報はどのように使うのかということは、規格の範囲外である。
たとえば、コンパイラーは、deprecated属性の付与された名前が使われた場合、警告メッセージを出力する実装にできる。その際、指定した文字列リテラルも同時に出力するという実装もあり得る。
例えば、既存のC++実装であるGCCとClangでは、deprecated属性の付与された名前が使われた場合、警告メッセージを出力する。
なおこの機能はGCC 4.9, Clang 3.4で実装されている。
Clang - C++1z, C++14, C++11 and C++98 Status
C++1y/C++14 Support in GCC - GNU Project - Free Software Foundation (FSF)
See Also:
本の虫: C++14の新機能: decltype(auto)
本の虫: C++14の新機能: 初期化lambdaキャプチャー
本の虫: C++14の新機能: constexpr関数の制限緩和
本の虫: C++14の新機能: メンバー初期化子と初期化リストの組み合わせ
ドワンゴ広告
この記事はドワンゴ勤務中に書かれた。
今夜は盛大にボドゲが行われる予定だ。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0