C++1y [[deprecated]]属性の提案

N3760 [[deprecated]] attribute


機能(関数、クラス)が非推奨であることをコンパイラに伝える、deprecated属性の提案。

VC++GCCも、昔から独自の属性構文でdeprecated機能を持っていました。GCCには4.8から、C++11の属性構文でgnu::deprecated属性が実装されています:

[[gnu::deprecated("please use new_func() function")]]
void old_func() {}

void new_func() {}

int main()
{
  old_func();
}

「この機能は古くて非推奨だから、新しく作ったこの機能を使ってください」というのを、コードで示し、非推奨機能を使っているユーザーに警告メッセージで通知するのに使用します。


標準ライブラリの範囲としては、C++11で、C++03のいくつかの機能を非推奨にしました(auto_ptr、bind1st、bind2nd、unary_function、binary_function、…)。auto_ptrの代わりにunique_ptr or shared_ptr、bind1stの代わりにbind、unary_functionの代わりにfunctionを使いましょう、といった推奨を示すために使用できますね。


この提案では、GCC 4.8のそれと同じく、メッセージを文字列リテラルで指定可能にすることが考えられています。
deprecated属性を指定可能なものとしては、以下のものが考えられています:

  • クラス宣言
  • typedef名
  • 変数
  • 非静的データメンバ
  • 関数
  • 列挙子
  • テンプレートの特殊化