2014-10-03

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の新機能: 2進数リテラル

本の虫: C++14の新機能: decltype(auto)

本の虫: C++14の新機能: 関数の戻り値の型推定

本の虫: C++14の新機能: 初期化lambdaキャプチャー

本の虫: C++14の新機能: 変数テンプレート

本の虫: C++14の新機能: constexpr関数の制限緩和

ドワンゴ広告

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

今夜は盛大にボドゲが行われる予定だ。

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

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

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

No comments: