ADL Barrier

  • 名前空間を限定しないで関数を呼び出すと、ADLが引き起こされて名前が衝突する可能性がある
    • これは呼び出した側のバグであるが、標準ライブラリにもある
    • GCCでは関数名とクラス名も衝突する・・・参照
  • 完全な安全のためには、型は自分専用の名前空間にいなければならない
  • そこで・・・ダウンロード
  • このマクロはADLのないコンパイラでは何もしません


[]#include[] []<pstade/adl_barrier.hpp>[]

[]namespace[] []xxx[][] {[]

[]PSTADE_ADL_BARRIER_OPEN[][]([][]aaa[][])[]

[]struct[] []aaa[][] { };[]

[]PSTADE_ADL_BARRIER_CLOSE[][]([][]aaa[][])[]

[]void[] []begin[][]([][]aaa[][])[]
[] {[]
[]PSTADE_TEST[][]([][]false[][]);[]
[] }[]
[]}[]

[]namespace[] []yyy[][] {[]

[]PSTADE_ADL_BARRIER_OPEN[][]([][]bbb[][])[]

[]struct[] []bbb[][] { };[]

[]PSTADE_ADL_BARRIER_CLOSE[][]([][]bbb[][])[]

[]struct[] []end[][] { };[]

[]}[]

[]void[] []begin[][]([][]xxx[][]::[][]aaa[][]) { }[]
[]void[] []end[][]([][]yyy[][]::[][]bbb[][]) { }[]

[]void[] []test_adl_barrier[][]()[]
[]{[]
[]pstade[][]::[][]print[][]([][]"adl_barrier..."[][]);[]

[]xxx[][]::[][]aaa[] []a[][];[]
[]begin[][]([][]a[][]);[]

[]yyy[][]::[][]bbb[] []b[][];[]
[]end[][]([][]b[][]);[]
[]}[]