简单单行函数中的“无法访问代码”警告

时间:2013-02-25 14:41:29

标签: c++ visual-studio-2010 boost compiler-warnings

我在Boost.Variant,班级boost::detail::variant::invoke_visitor中有220个“无法访问的代码”警告:

template <typename T>
result_type internal_visit(T& operand, int)
{
    return visitor_(operand);
}

boost_1_50_0\boost\variant\variant.hpp(859): warning C4702: unreachable code

return visitor_(operand);

首先,在这个简单的单行函数中,如何才能实现无法访问的代码?哪些代码无法访问?

我无法在一个简单的情况下重现这个警告,似乎因为我不明白究竟是什么导致它。我为operator==中使用的类实现boost::variant后出现警告。

环境:VC ++ 2010,Boost 1.50

修改

警告仅在发布版本(优化)中发生,并且仅在我比较boost::variant时才会发生。我将boost::variant与原始和自定义类型一起使用。自定义类型将典型的bool operator(CT const& lh, CT const& rh)实现为自由函数。

2 个答案:

答案 0 :(得分:2)

我在VS 2017中遇到了这个问题。如果编译器确定visitor_(T&)将始终抛出异常,那么“无法访问”部分就是返回。如果您打算将其解包到以下内容中:

auto v = visitor_(operand);
return v;

编译器会将return v;称为无法访问。就我而言,我使用的是基于策略的类,NullPolicy引发了异常。我最终只是删除了异常。

有趣的事实:如果你打开LTCG,你只会在链接阶段得到错误,所以你甚至不知道从哪里开始。关闭LTCG但留下优化将至少让你通过编译违规文件来缩小范围。

答案 1 :(得分:0)

以防万一有人偶然发现同一件事:(我在MSVS 2017 v15.7.4中经历过)

class Widget
{
public:
    void bar()
    {
        foo = 0; // C4702 here
    }

    void foobar()
    {
        return; // NOTE direct return here
        bar();
    }

private:
    int foo;
};

这是在旧代码中,有人“注释”了整个功能foobar(),而原始代码留作“未来参考”。 (是的,很难使用源代码控制)

现在,在发布模式下,编译器内联了函数bar(),这导致了C4702:无法访问的代码警告,但它指出了函数bar()的第一行,看似没有什么错。 (实际上,return;之后的每一行代码都触发了警告)