Skip to content

Latest commit

 

History

History
28 lines (17 loc) · 1.5 KB

032-cpp17-core-using-attribute-namespace.md

File metadata and controls

28 lines (17 loc) · 1.5 KB

using属性名前空間

C++17では、属性名前空間にusingディレクティブのような記述ができるようになった。

// [[extension::foo, extension::bar]]と同じ
[[ using extension : foo, bar ]] int x ;

属性トークンには、属性名前空間を付けることができる。これにより、独自拡張の属性トークンの名前の衝突を避けることができる。

たとえば、あるC++コンパイラーには独自拡張としてfoo, barという属性トークンがあり、別のC++コンパイラーも同じく独自拡張としてfoo, barという属性トークンを持っているが、それぞれ意味が違っている場合、コードの意味も違ってしまう。

[[ foo, bar ]] int x ;

このため、C++には属性名前空間という文法が用意されている。注意深いC++コンパイラーは独自拡張の属性トークンには属性名前空間を設定していることだろう。

[[ extension::foo, extension::bar ]] int x ;

問題は、これをいちいち記述するのは面倒だということだ。

C++17では、using属性名前空間という機能により、usingディレクティブのような名前空間の省略が可能になった。文法はusingディレクティブと似ていて、属性の中でusing name : ...と書くことで、コロンに続く属性トークンに、属性名前空間nameを付けたものと同じ効果が得られる。