一時オブジェクト禁止

思い付いた気がする.厳密な意味で一時オブジェクトを(コンパイル時に)禁止は出来ないが,必ず例外を投げるようにする.変数を束縛したときのみ正しく走るクラス.ExceptionalだかEffectiveだかのC++本に,「自己代入をチェックすべきか」という章があって,そこの話を思い出した.それによれば規格的には違法だそうだが多分多くのコンパイラで通るだろう:

class NoTemp {
public:
    NoTemp(const char *me) {
        if (static_cast<void*>(this) != static_cast<void*>(me))
            throw std::logic_error("USAGE: char nt[sizeof(NoTemp)]; new(nt) NoTemp(nt);");
    }
};

上のコードがコンパイル通るかどうか,上記の目的を達しているかどうか,実際には一切試してない.試すほどの価値も無い...
追記: てか char[] としてスタックを使ってるので NoTemp のdtorが呼ばれないから,今回の話の発端である scoped_lock 的には使えないのであった.