このページはC++17に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
複数の属性を指定する際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.