当我有一个按值捕获对象的 C++ lambda,并且该对象可以在其复制构造函数中抛出异常时,clang-tidy 将显示警告:
警告:函数中可能会抛出异常 '(lambda at :15:23)' 不应引发异常 [容易出错的异常转义]
我不明白为什么会出现这个警告。
示例代码:
#include <functional>
class MyClass {
public:
MyClass() {}
MyClass(const MyClass& rhs) { throw std::exception(); }
void do_stuff() const {}
};
void inner_func(std::function<void()>&& the_func) {}
void outer_func() {
MyClass test_obj;
auto the_lambda = [=]() { test_obj.do_stuff(); };
inner_func(std::move(the_lambda));
}
(在 godbolt.org 上:https://godbolt.org/z/67xW6Yenx)
创建
the_lambda
的行会显示 clang-tidy 警告。
我不明白为什么 lambda(或创建 lambda)不能抛出异常。在示例中,
outer_func()
并不关心是否发生异常。 inner_func()
也不应该在意这个。
此外,显然 lambda 需要 std::move()d 到另一个函数中才能出现警告。
所以看来仅仅创建 lambda 就已经是一个问题了。但为什么会这样呢?我怎样才能捕获这个警告的异常,或者我怎样才能避免警告?
在 Godbolt 上,我用 clang-tidy 16 和 19 尝试了这个,得到了相同的结果。
手册描述了何时发出警告。
MyClass
没有非抛出移动构造函数,因为该类有一个用户定义的复制构造函数。