"unreachable code"警告,简单的单行功能

"unreachable code" warning in simple single-line function

本文关键字:单行 功能 简单 unreachable code 警告      更新时间:2023-10-16

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

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

boost_1_50_0boostvariantvariant.hpp(859): warning C4702: unreachable code

线路CCD_ 2。

首先,在这个简单的单行函数中,怎么可能有无法访问的代码?哪个代码无法访问?

我无法在一个简单的例子中重现这个警告,似乎是因为我不明白它的确切原因。这个警告是在我为boost::variant中使用的类实现operator==之后出现的。

环境:VC++2010,Boost 1.50

编辑:

只有在Release build(优化(中,并且只有当我比较boost::variant s时,才会出现警告。我将boost::variant与基元和自定义类型一起使用。自定义类型将典型的bool operator(CT const& lh, CT const& rh)实现为自由函数。

我自己在VS 2017中也遇到过这个问题。如果编译器确定visitor_(T&)总是抛出异常,那么"不可访问"部分就是返回。如果你要将其打开到以下内容中:

auto v = visitor_(operand);
return v;

编译器会将return v;调用为不可访问。在我的案例中,我使用了一个基于策略的类,NullPolicy抛出了异常。我最终只是删除了这个例外。

有趣的事实:如果你打开LTCG,你只会在链接阶段出现错误,所以你甚至不知道从哪里开始。关闭LTCG,但继续优化,至少可以通过使有问题的文件编译失败来缩小范围。

以防其他人遇到同样的事情:(我在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;触发警告后的每一行代码(