C++訳分からなすぎワロタ (1) if文でスコープを作れる

#include <iostream>
#include <stdexcept>
#include <memory>
using namespace std;

class SpaceObject {
public:
    virtual void Kaboom(SpaceObject *pObject) = 0;
};

class Meteorite;
class SpaceShip : public SpaceObject {
public:
    virtual void Kaboom(SpaceObject *pObject);
protected:
    void Kaboom(SpaceShip &other) { cout << "SpaceShip with SpaceShip" << endl; }
    void Kaboom(Meteorite &other) { cout << "SpaceShip with Meteorite" << endl; }
};

class Meteorite : public SpaceObject {
public:
    virtual void Kaboom(SpaceObject *pObject) { throw logic_error("unimplemented"); }
};

void SpaceShip::Kaboom(SpaceObject *pObject)
{
    if (SpaceShip *pShip = dynamic_cast<SpaceShip*>(pObject)) {
        Kaboom(*pShip);
    } else if (Meteorite *pMeteo = dynamic_cast<Meteorite*>(pObject)) {
        Kaboom(*pMeteo);
    } else {
        throw logic_error("Maybe we have found an UFO.");
    }
}

int main() {
    auto_ptr<SpaceObject> pObj1(new SpaceShip), pObj2(new Meteorite);
    pObj1->Kaboom(&*pObj2);
    pObj1->Kaboom(&*pObj1);
}

SaceShip with Meteorite
SpaceShip with SpaceShip

ポインタに限らず operator bool() と代入形式のctorが使えるクラスなら,任意のオブジェクトを定義できるみたい.こういうのって規格のどこに載ってるんだ...? 内部クラスを含む,関数呼び出し形式のctorでは(例え代入形式がコンパイル通っても)駄目みたいだ.微妙だ...
いや,言いたかったのは,C++って言うと

for (int i = 0; i < 10; ++i) cout << "i=" << i << endl;

この i がfor文ローカルになるのはかなり有名だと思うが,それだけじゃなかったYO ということだ.ついでにfor文の第2スロットでも変数が定義できた...

#include <iostream>
using namespace std;

class Until5 {
    int x;
public:
    Until5(int x) : x(x) { }
    int getX() { return x; }
    operator bool() { return x<5; }
};

class Incer {
public:
    Incer(int &x) { ++x; }
};

int main() {
    for (int i(0); Until5 u5 = i; Incer /* inc = */ (i))
        cout << "i=" << u5.getX() << endl;
}

i=0
i=1
i=2
i=3
i=4

何が何やら.残念ながら(コメントアウトしてあるが)第3スロットでは変数は定義できなかった.上のコードはコメントアウトにより,単なる一時オブジェクトの生成である.(STL iterator++i でない i++ みたいなもんだ)
どうせならC#using 相当を付けて欲しかった... 単なる中括弧で済むので絶対に入ることはなかろうけど,意図の問題なんだよ!
なお多重ディスパッチについては Sutter, More Exceptional C++, ピアソン に細かく書いてあった気がする.