名前空間
変種
操作

属性指定子(C++11およびそれ以降)

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 
属性
(C++14)
(C++17)
(C++20)(C++20)
(C++20)(C++20)(C++20)
 

型、オブジェクト、コードなどに対する処理系定義の属性を導入します。

[[attr]] [[attr1, attr2, attr3(args)]] [[namespace::attr(args)]] alignas_specifier

形式的には、構文は以下の通りです。

[[ attribute-list ]] (C++11およびそれ以降)
[[ using attribute-namespace : attribute-list ]] (C++17およびそれ以降)
[[ contract-attribute-token contract-level(オプション) identifier(オプション) : expression ]] (C++20およびそれ以降)

ただし attribute-list は0個以上の attribute のコンマ区切りの並びです (パック展開を表す省略記号 ... で終わっても構いません)。

identifier (1)
attribute-namespace :: identifier (2)
identifier ( argument-list ) (3)
attribute-namespace :: identifier ( argument-list ) (4)
1) 単純な属性 ([[noreturn]] など)
2) 名前空間付きの属性 ([[gnu::unused]] など)
3) 引数付きの属性 ([[deprecated("because")]] など)
4) 名前空間と引数リストの両方を持つ属性

属性リストの先頭に using: namespace が現れる場合、その属性リストの他の属性は名前空間を指定できません。 using で指定された名前空間はそれらすべてに適用されます。

[[using CC: opt(1), debug]] // [[CC::opt(1), CC::debug]] と同じです
[[using CC: CC::opt(1)]] // エラー、 using とスコープ付き属性を組み合わせることはできません
(C++17およびそれ以降)

契約属性は特殊な属性の構文を持ちます。 それぞれの契約属性はそれ自身の独立した属性指定子 ([[]]) 内になければなりません。 複数の契約属性指定子を同じエンティティに適用することはできます。

(C++20およびそれ以降)

目次

[編集] 説明

属性は処理系定義の言語拡張 (GNU や IBM の言語拡張 __attribute__((...)) およびマイクロソフトの拡張 __declspec() など) に対する統一された標準的な構文を提供します。

属性は C++ プログラムのほとんどあらゆる場所で使用でき、ほとんどすべてのもの (型、変数、関数、名前、コードブロック、翻訳単位全体) に適用できます。 ただし個々の特定の属性は処理系によって許される場所でのみ有効です。 例えば、 [[expect_true]]if でのみ使用できクラス宣言には使用できない属性であるとか、 [[omp::parallel()]] はコードブロックや for ループにのみ適用でき int 型には適用できない属性であるとかです (これらは例示用の架空の属性です。 標準の属性については下の一覧を参照してください)。

宣言では、属性は宣言全体の前および宣言されているエンティティの名前の直後に現れることができます。 これらは組み合わせられます。 ほとんどの状況では、属性は直前のエンティティに適用されます。

alignas 指定子は、異なる構文を持ちますが、属性指定子の並びの一部です。 [[...]] 属性が現れる場所に現れることができ、それらを混ぜても構いません (alignas が許される場所で使用される場合)。

2個の連続する開き角括弧のトークン ([[) は、属性指定子を導入するとき、または、 属性引数の内部でのみ、現れることができます。

void f() {
  int y[3];
  y[[] { return 0; }()] = 1;    // error
  int i [[cats::meow([[]])]]; // OK
}

以下に掲載されている標準の属性の他に、処理系は処理系定義の動作を持つ任意の非標準な属性をサポートするかもしれません。 処理系にとって未知なすべての属性は、エラーを発生することなく無視されます。 (C++17およびそれ以降)

[編集] 標準の属性

以下の属性のみが C++ 標準によって定義されています。

[[noreturn]] 関数が戻らないことを示します
[[carries_dependency]] 解放-消費の std::memory_order の依存連鎖が関数の内外へ伝播することを示します
[[deprecated]](C++14)
[[deprecated("reason")]](C++14)
この属性付きで宣言された名前またはエンティティは、使用することはできますが、何らかの理由 reason により非推奨であることを示します
[[fallthrough]](C++17) 直前の case ラベルからのフォールスルーが意図的なものであり、フォールスルーを警告するコンパイラによって診断されるべきでないことを示します
[[nodiscard]](C++17) 戻り値が破棄される場合に警告を発行することをコンパイラに推奨します
[[maybe_unused]](C++17) 未使用なエンティティに対するコンパイラの警告 (もしあれば) を抑制します
[[likely]](C++20)
[[unlikely]](C++20)
文を通る実行経路が他のあらゆる実行経路よりも可能性が高いまたは低い場合に対してコンパイラが最適化するべきであることを示します
[[no_unique_address]](C++20) 非静的データメンバがそのクラスの他のすべての非静的データメンバと異なるアドレスを持つ必要がないことを示します
[[expects]](C++20)
[[ensures]](C++20)
[[assert]](C++20)
関数に対する事前条件、事後条件、およびアサーションを指定します
[[optimize_for_synchronized]](TM TS) 関数定義が synchronized 文からの呼び出しのために最適化されるべきであることを示します

[編集]

[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]] [[nodiscard]]
inline int f(); // 4つの属性を付けて f を宣言します
 
[[gnu::always_inline, gnu::const, gnu::hot, nodiscard]]
int f(); // 上と同じですが、4つの属性を持つ単一の属性指定子を使用します
 
// C++17:
[[using gnu : const, always_inline, hot]] [[nodiscard]]
int f[[gnu::always_inline]](); // ひとつの属性が複数の指定子内に現れても構いません
 
int f() { return 0; }
 
int main()
{
}


[編集] 外部リンク

C++ attributes supported by Clang