C++17では、属性名前空間にusingディレクティブのような記述ができるようになった。
// [[extention::foo, extention::bar]]と同じ
[[ using extention : foo, bar ]] int x ;
属性トークンには、属性名前空間をつけることができる。これにより、独自拡張の属性トークンの名前の衝突を避けることができる。
例えば、あるC++コンパイラーには独自拡張としてfoo, barという属性トークンがあり、別のC++コンパイラーも同じく独自拡張としてfoo, barという属性トークンを持っているが、それぞれ意味が違っている場合、コードの意味も違ってしまう。
[[ foo, bar ]] int x ;
このため、C++には属性名前空間という文法が用意されている。注意深いC++コンパイラーは独自拡張の属性トークンには属性名前空間を設定していることだろう。
[[ extention::foo, extention::bar ]] int x ;
問題は、これをいちいち記述するのは面倒だということだ。
C++17では、using属性名前空間という機能により、usingディレクティブのような名前空間の省略が可能になった。