属性指定子(C++11以上)
型、オブジェクト、コードなどに対する処理系定義の属性を導入します。
[[
attr]]
[[
attr1, attr2, attr3(
args)
]]
[[
namespace::
attr(
args)
]]
alignas_specifier
形式的には、構文は以下の通りです。
[[ attribute-list ]]
|
(C++11以上) | ||||||||
[[ using attribute-namespace : attribute-list ]]
|
(C++17以上) | ||||||||
ただし attribute-list は0個以上の attribute のコンマ区切りの並びです (パック展開を表す省略記号 ...
で終わっても構いません)。
identifier | (1) | ||||||||
attribute-namespace :: identifier
|
(2) | ||||||||
identifier ( argument-list )
|
(3) | ||||||||
attribute-namespace :: identifier ( argument-list )
|
(4) | ||||||||
属性リストの先頭に [[using CC: opt(1), debug]] // [[CC::opt(1), CC::debug]] と同じです [[using CC: CC::opt(1)]] // エラー、 using とスコープ付き属性を組み合わせることはできません |
(C++17以上) |
目次 |
[編集] 説明
属性は処理系定義の言語拡張 (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)[[nodiscard("reason")]] (C++20)
|
戻り値が破棄される場合に警告を発行することをコンパイラに推奨します |
[[maybe_unused]] (C++17)
|
未使用なエンティティに対するコンパイラの警告 (もしあれば) を抑制します |
[[likely]] (C++20)[[unlikely]] (C++20)
|
文を通る実行経路が他のあらゆる実行経路よりも可能性が高いまたは低い場合に対してコンパイラが最適化するべきであることを示します |
[[no_unique_address]] (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() { }