"unreachable code"警告,简单的单行功能
"unreachable code" warning in simple single-line function
我在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;
触发警告后的每一行代码(
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- QAbstractTableModel,并为单行发出dataChanged
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- "unreachable code"警告,简单的单行功能