首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用VS 2015的编译器警告4456

使用VS 2015的编译器警告4456
EN

Stack Overflow用户
提问于 2018-03-12 08:02:42
回答 1查看 771关注 0票数 0

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

代码语言:javascript
运行
复制
warning C4456: Declaration of "iter" shadows previous declaration

这是我的小节目:

代码语言:javascript
运行
复制
#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,该程序将崩溃。

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-12 10:45:00

VS是正确的。您手头有两个iter

代码语言:javascript
运行
复制
#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
    }
}

那是因为

代码语言:javascript
运行
复制
if(value = foo()) { 
    bar();
} else { 
    quux();
}

是相同的

代码语言:javascript
运行
复制
{
    value = foo();

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

注意,valueelse的作用域。这包括(隐式) if块中的任何嵌套else。您可以在C++11的stmt.select部分,第3段中查看此内容:

…由条件中的声明引入的名称(由类型说明符-seq或条件的声明者引入)从声明点一直到条件控制的子语句结束。如果名称在由条件控制的子语句的最外层块中重新声明,则重新声明名称的声明是格式错误的。[例子: 如果(int x= f()) { int x;//,则重新声明x}ill{ int x;// redeclaration,重新声明x}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49230548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档