编译器警告4456使用VS 2015

时间:2018-03-12 08:02:42

标签: c++ visual-studio-2015 compiler-warnings boost-variant

如果我使用Visual Studio 2015编译以下小程序, 我在第9行得到以下编译器警告:

warning C4456: Declaration of "iter" shadows previous declaration

这是我的小程序:

#include <iostream>
#include <boost/variant.hpp>

int main(int argc, char** args) {
    boost::variant<double, int> v{ 3.2 };
    if (auto iter = boost::get<int>(&v)) {
        std::cout << *iter << std::endl;
    }
    else if( auto iter = boost::get<double>(&v)) {
        std::cout << *iter << std::endl;
    }
}

我很好奇这是编译器错误还是严重错误。

正如@Zeta所知,以下是合法的C ++代码,即使我从未想过。由于使用了未定义的iter,程序将崩溃。

#include <iostream>
#include <boost/variant.hpp>

int main(int, char**) {
    boost::variant<double, int> v{ 3.2 };
    if (auto iter = boost::get<int>(&v)) {
        std::cout << *iter << std::endl;
    }
    else if( auto iter2 = boost::get<double>(&v)) {
        std::cout << *iter2 << std::endl;
        std::cout << *iter << std::endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

VS是对的。您手边有两个iter

#include <iostream>
#include <boost/variant.hpp>

int main(int argc, char** args) {
    boost::variant<double, int> v{ 3.2 };
    if (auto iter = boost::get<int>(&v)) {
        std::cout << *iter << std::endl;
    }
    else if( auto iter2 = boost::get<double>(&v)) {
        std::cout << *iter << std::endl; // whoops
    }
}

那是因为

if(value = foo()) { 
    bar();
} else { 
    quux();
}

相同
{
    value = foo();

    if(value) { 
        bar();
    } else { 
        quux();
    }
}

请注意,value适用于else。这包括(隐式)if块中的任何嵌套else。您可以在C ++ 11的[stmt.select]部分第3段中查看:

  

......条件中声明引入的名称(或者   由type-specifier-seq或者声明者引入   条件)从声明的范围到结束   由条件控制的子语句。如果名字是   重新声明在受控制的子语言的最外层   条件,重新声明名称的声明是不正确的。 [   例如:

if (int x = f()) {
    int x; // ill-formed, redeclaration of x
}
else {
    int x; // ill-formed, redeclaration of x
}