2

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

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::variants. 我使用boost::variant原始类型和自定义类型。自定义类型实现了典型bool operator(CT const& lh, CT const& rh)的自由函数。

4

2 回答 2

3

我自己在 VS 2017 中遇到了这个问题。如果编译器确定visitor_(T&)将始终抛出异常,则“无法访问”部分是返回。如果您要将其解压缩成以下内容:

auto v = visitor_(operand);
return v;

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

有趣的事实:如果您启用了 LTCG,您只会在链接阶段收到错误,因此您甚至不知道从哪里开始。关闭 LTCG 但保留优化至少可以让您通过编译有问题的文件失败来缩小范围。

于 2018-05-04T22:54:47.350 回答
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: unreachable code 警告的函数,但它表明函数的第一行bar()似乎没有任何问题。return;(实际上是触发警告后的每一行代码)

于 2018-09-13T10:35:36.420 回答