範囲for文は変数宣言をしないといけない

範囲for文の構文は以下のようになっています:

for ( for-range-declaration : expression ) statement

要素の部分がfor-range-declaration、すなわち宣言を要求しています。なので、以下のような変数を先に定義しておいて、毎回各要素を代入する、というようなコードは直接は書けません。

#include <iostream>
#include <vector>

int main()
{
    const std::vector<int> v = {1, 2, 3};

    int x = 0;
    for (x : v) { // エラー!xは変数宣言でなくてはならない
        std::cout << x << std::endl;
    }
}

BoostにあるBOOST_FOREACHマクロは、このような表記を許可していますので、完全な置き換えができない点ですね。