我在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)
实现为自由函数。
答案 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;
之后的每一行代码都触发了警告)