C++ - 叮叮当当抱怨 X 规则?

C++ - clang tidy complain about rule of X?

提问人:LeXav 提问时间:2/17/2023 最后编辑:DailyLearnerLeXav 更新时间:2/20/2023 访问量:174

问:

此代码在 clang tidy 中引发警告:

类“Locker”定义非默认析构函数,但不定义复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符clang-tidy(cppcoreguidelines-special-member-functions)

这是更新后的结构,根据注释:

struct Locker
{
    std::binary_semaphore *sem = nullptr;

    // ----------------------------------
    // Methods
    // ----------------------------------
    auto try_lock(std::binary_semaphore &sem_, u32 time_in_seconds = 1) -> bool;

    auto manual_release() -> void;

    // ----------------------------------
    // Deleted
    // ----------------------------------

    Locker(Locker &) = delete;

    Locker(Locker &&) = delete;

    Locker(std::binary_semaphore &&sem_) noexcept = delete;

    Locker(std::binary_semaphore &sem_) noexcept = delete;

    Locker(std::binary_semaphore *sem_) noexcept = delete;

    Locker() noexcept = default;

    auto operator=(std::binary_semaphore &sem_) noexcept -> Locker & = delete;

    auto operator=(std::binary_semaphore &&sem_) noexcept -> Locker & = delete;

    auto operator=(std::binary_semaphore *sem_) noexcept -> Locker & = delete;

    // ----------------------------------
    // Destructor
    // ----------------------------------
    ~Locker()
    {

        manual_release();
    }
};

我不想要任何构造函数,但我想要一个特定的析构函数。 我们有方法可以尝试锁定,破坏者只需干净地释放锁,确保一切正常。

请注意,GCC 12.2 与

-Wall -Wextra -pedantic -pedantic-errors -Werror -Wuninitialized -Wtrivial-auto-var-init -Wshadow -Wnormalized -Wno-error=comment

甚至不打扰。

如何抑制该警告?

谢谢!

编辑:

下面是复制情况的 godbolt 链接,有人可以纠正我的代码并在这里分享链接吗?链接到 clang-tidy 结构问题

C++ 析构函数 法则

评论

1赞 463035818_is_not_an_ai 2/17/2023
与其说是压抑,不如说是定义它们。也许它们已经足够了,你试过了吗?= default
0赞 LeXav 2/17/2023
@463035818_is_not_a_number现在就可以了
3赞 Aconcagua 2/17/2023
按值划分的构造函数和运算符已经过时了,这些已经包含在 const 引用中——如果同时实现两者,你会遇到歧义。
1赞 463035818_is_not_an_ai 2/17/2023
@Aconcague 我引用的是我对特殊成员的建议,而不是压制警告,而不是引用代码中已经存在的构造函数=default
1赞 LeXav 2/17/2023
对于所有人来说,我添加了一个 godbolt 编译器链接,所有选项都带有 clang tidy 等等,有人可以更正我的代码并分享链接吗?

答:

1赞 463035818_is_not_an_ai 2/17/2023 #1

主要是在阿空加瓜和n.m.的帮助下,我们发现了你的误解是什么。

这有错误的签名:

Locker( Locker &) = delete;

Copy 构造函数采用 .而你不做任务。这些是五个:const Locker&delete

Locker(const Locker &) = delete;
Locker(Locker &&) = delete;
Locker& operator=(const Locker&) = delete;
Locker& operator=(Locker&&) = delete;
~Locker() { 
    std::cout << "";
 }

如果显式声明它们,则警告应该消失:https://godbolt.org/z/eP8TrE9b1