当捕获的对象在复制构造函数中抛出时警告“bugprone-exception-escape”

问题描述 投票:0回答:1

当我有一个按值捕获对象的 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 尝试了这个,得到了相同的结果。

c++ exception lambda move-semantics clang-tidy
1个回答
0
投票

手册描述了何时发出警告。

MyClass
没有非抛出移动构造函数,因为该类有一个用户定义的复制构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.