gpt4 book ai didi

c++ - 为什么 clang-tidy 建议在任何地方添加 [[nodiscard]] ?

转载 作者:行者123 更新时间:2023-12-03 23:25:47 25 4
gpt4 key购买 nike

我有一个 C++ 项目,其中 clang-tidy建议添加[[nodiscard]]到处。这是一个好习惯吗?我的理解是[[nodiscard]]仅当忽略返回值对程序可能是致命的时才应使用。我有一个对象 Car它有一个成员const unsigned int m_ID .如果 setter/getter unsigned int getID()[[nodiscard]] ? clang-tidy 建议如此。
编辑:
当然,我不想忽略 getter。但
我的观点是,如果每个返回值的函数都应该有 [[nodiscard]] ,然后属性 [[nodiscard]]反正是多余的。编译器可以简单地检查所有返回值的函数。

最佳答案

这个选项显然是 "modernize-use-nodiscard", so you can deactivate that if you prefer .
应该注意,此选项概​​述的规则不是 C++ 标准委员会自己在何时应用 [[nodiscard]] 时使用的规则。 . Those rules being :

It should be added where:

  • For existing API’s
    • not using the return value always is a “huge mistake” (e.g. always resulting in resource leak)
    • not using the return value is a source of trouble and easily can happen (not obvious that something is wrong)
  • For new API’s (not been in the C++ standard yet)
    • not using the return value is usually an error.

It should not be added when:

  • For existing API’s
    • not using the return value is a possible/common way of programming at least for some input
      • for example for realloc(), which acts like free when the new site[sic] is 0
    • not using the return value makes no sense but doesn’t hurt and is usually not an error (e.g., because programmers meant to ask for a state change).
    • it is a C function, because their declaration might not be under control of the C++ implementation

这就是为什么像 operator new 这样的函数是 [[nodiscard]] , 而像 optional::value 这样的函数不是。你的代码有一个小错误和你的代码从根本上被破坏是有区别的。 [[nodiscard]] ,就委员会而言,是为后者。
请注意,容器 empty方法是一种特殊情况。它们似乎符合“不使用 [[nodiscard]]”的模式,但因为 empty 的名称类似于 clear 的名称, 如果不使用 empty 的返回值, 你打算调用 clear 的可能性很大.
显然,这不能仅从声明中得知,因此 Clang-Tidy 无法实现所述规则。

关于c++ - 为什么 clang-tidy 建议在任何地方添加 [[nodiscard]] ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67059884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com