最終更新日時(UTC):
が更新

履歴 編集

属性の名前空間指定に繰り返しをなくす(C++17)

概要

複数の属性を指定する際usingにより名前空間を指定できる。

同じ名前空間に属する複数の属性を指定したい場合がある。従来は同じ名前空間を何度も記述しなければならなかったが、usingで名前空間を指定することで一度で記述できるように変更された。

仕様

文法仕様は下記の通り。

attribute-specifier:
    [ [ attribute-using-prefix opt attribute-list ] ]
    alignment-specifier

attribute-using-prefix:
    using attribute-namespace :

属性の先頭部分にusing、名前空間、コロン:の順に記述し、その後に続けて属性の名前を記述する。

usingで名前空間を指定した場合は、続く属性の名前に名前空間は指定できない。usingで複数の名前空間を指定することもできない。

[[CC::opt(1)]] [[CC::debug]] void f() {}
  //正しい

[[CC::opt(1), CC::debug]] void g() {}
  //正しい

[[using CC: opt(1), debug]] void h() {}
  //正しい、上記の [[CC::opt(1), CC::debug]] と同じ意味になる

[[using CC: opt(1)]] [[CC::debug]] void i() {}
  //正しい、上記と同じ意味になる

[[using CC: CC::opt(1)]] void j() {}
  //間違い、usingと名前空間の指定は混在できない

int main() {}

出力

不適格

警告例

clang++ 5.0.0 にてコンパイルした場合。

using_attribute_namespaces.cpp:13:13: error: attribute with scope specifier cannot follow default scope specifier
[[using CC: CC::opt(1)]] void j() {}
        ~~  ^
1 error generated.

関連項目

参照