如果我使用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;
}
答案 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 }