if括弧内で定義した変数の生存期間

ifの括弧内で定義した変数ってelseのスコープでも有効なのね。知らなかった。

// hoge.cpp
#include <string.h>
#include <stdio.h>
int main(int argc, const char** argv) {
    if(int len = strlen(argv[1])) {
        printf("then, '%s' len = %d\n", argv[1], len);
    } else {
        printf("else, '%s' len = %d\n", argv[1], len); // ここでも len が使える
    }
    return 0;
}
$ g++ hoge.cpp && ./a "xyz" && ./a ""
then, 'xyz' len=3
else, '' len=0

vc14から同一スコープ内で同名の変数を定義すると警告が出るようになったので、始めて気付きました。

// 最初に見つかったインターフェースを使う
if(auto ptr = get_primary_interface()) {
    ptr->doit();
} else
if(auto ptr = get_secondary_interface()) {
    ptr->doit();
} else
if(auto ptr = get_avoid_interface()) {
    ptr->doit();
} else {
    assert(!"絶望的");
}

こんなことをよく書いてたので怒られまくり。