変数のスコープはfor内に入れてでもできるだけ狭くしたほうがいいか？


初歩的な質問です．下記のようなコードがあったとします．

[code]

    for(int i=0; i<100; ++i)
    {
        int a = i;
        std::cout << a << std::endl;
    }
    
[/code]

ここで，aはforの中でしか使用しません．しかし，スコープをできるだけ小さくしたほうがいいからといってforの中に入れて何回も宣言させるのは効率が悪い気がします．つまり，

[code]

    int a;
    for(int i=0; i<100; ++i)
    {
         a = i;
        std::cout << a << std::endl;
    }
    
[/code]

このようなプログラムとではスコープが大きくなる以外で何か不都合が起きたりするのでしょうか．




C++言語にはコンストラクタ・デストラクタが存在します。

>
[code]

>     int a = i;
>  
[/code]

は`i`で初期化されますが

>
[code]

>     int a;
>     a = i;
>  
[/code]

は空で初期化した上で、後から`i`をコピー・代入を行っています。また、デストラクターが実行されるタイミングも後者は`for`ループ終了直後ですが、前者はスコープを抜けるまでそのまま生き続けます。  
単純な整数であれば違いはありませんが、汎用性を考慮すれば常に適切な変数スコープを意識すべきです。

これに関連して、C++言語では`for`だけでなく`if`や`switch`でも効率的な変数宣言できるように拡張されています。[if文とswitch文の条件式と初期化を分離](https://cpprefjp.github.io/lang/cpp17/selection_statements_with_initializer.html)

