同じスコープ内に重複した名前を宣言する

お遊び。


namespace ns {
typedef int declared;
struct undeclared {
int dummy[2];
};

template<size_t> struct S;

template<>
struct S<sizeof(undeclared)> {
template<int>
struct SS {
declared n;
void operator=(int) {}
SS(int) {}
friend SS & operator>(int, SS & ss) { return ss; }
};
};

template<>
struct S<sizeof(declared)> {
static int const SS = 0;
};
}
extern ns::undeclared copy_and_paste;

void f() {
ns::S<sizeof(copy_and_paste)>::SS<0> copy_and_paste = 0;
ns::S<sizeof(copy_and_paste)>::SS<0> copy_and_paste = 0;
ns::S<sizeof(copy_and_paste)>::SS<0> copy_and_paste = 0;
ns::S<sizeof(copy_and_paste)>::SS<0> copy_and_paste = 0;
ns::S<sizeof(copy_and_paste)>::SS<0> copy_and_paste = 0;
}

さすがにこれだけだとすぐに分かるけど、f()内の二つ目以降のcopy_and_pasteは宣言ではなく、ns::operator>(ns::S::SS < 0, copy_and_paste).operator=(0) という式。
Boost.ScopeExitの実装で見つけた。至るところにある気がする。

C++演算子オーバーロードとテンプレート特殊化は実に恐ろしい。