同じスコープ内に重複した名前を宣言する
お遊び。
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
Boost.ScopeExitの実装で見つけた。至るところにある気がする。