【问题标题】:How to convert a virtual function with const noexcept from c++11 to c++17?如何将具有 const noexcept 的虚函数从 c++11 转换为 c++17?
【发布时间】:2020-03-10 10:20:07
【问题描述】:

我敢肯定,对于这里的 c++17 大师来说,这是一个简单的问题。我正在尝试使用 clang-tidy 和 clang-9 将一些 c++11 现代化到 gnu++17,并且对 clang-tidy 指示要修复的内容以及如何修复它感到困惑。

这是头文件中的一些原始代码

namespace foo{
class bar {
 public:
  virtual ~bar() = default;
  virtual RealtimeConfig realtimeConfig() const noexcept = 0;
};
}

整洁的变化

'realtimeConfig' 应标记为 [[nodiscard]]

警告:此函数使用尾随返回类型

虚拟 RealtimeConfig realtimeConfig() const noexcept = 0;

      ~~~~~~~~~~~~~~ ^
      auto                                           -> RealtimeConfig

我已阅读此处CPP 的文档,但我不明白以下内容的目的是什么

const noexcept = 0;

似乎没有什么可扔的,那么它是如何返回的呢?那么我需要做什么才能通过 clang-tidy?

如果这个问题的位置不对,请告诉我,以便我移动它。

【问题讨论】:

  • 这真的是使 clang-tidy 发出警告的所有代码吗?我不知道 clang-tidy,但是当您在方法声明中没有 auto 时,它会警告添加尾随返回类型,这看起来有点奇怪。此外,您关于noexcept = 0; 的问题似乎与来自clang 的警告无关。这不是你的代码吗?谁把noexcept = 0; 放在那里了?顺便说一句,const 不属于noexcept,但它将该方法声明为const 方法
  • 换句话说:请提供minimal reproducible example,每个问题请回答一个问题
  • clang-tidy 和很多这样的工具一样,经常会基于主观考虑(例如风格、包括作者在内的特定人或群体所倡导的偏好等)发布“建议”。这意味着您应该将这些消息视为“要考虑的选项”,而不是“使您的代码更好的遵循方向”。您可能有充分的理由不指定 [[nodiscard]] 或不使用训练返回类型 - 在这种情况下,盲目地处理来自 clang-tidy 的警告会适得其反。

标签: c++ clang c++17


【解决方案1】:

第一个警告告诉你使用nodiscard 属性:

[[nodiscard]] virtual RealtimeConfig realtimeConfig() const noexcept = 0;

如果有人在没有使用返回值的情况下调用realtimeConfig,这将发出编译器警告。

第二个警告是个人风格的事情。它只是告诉您使用尾随返回类型:

virtual auto realtimeConfig() const noexcept -> RealtimeConfig = 0;

这没有好处或坏处。

const noexcept = 0; 实际上是三个不同的东西:

  1. const 限制成员函数使用const this 而不是this。这基本上意味着您不能修改类的成员,而只能调用其他 const 成员函数。
  2. noexcept 保证您的函数不会抛出任何异常。如果是,则程序终止。
  3. = 0 只能与virtual 结合使用。它声明了一个纯虚函数(其他语言称它们为抽象函数)。

总而言之(根据您的clang-tidy),您的声明应如下所示:

[[nodiscard]] virtual auto realtimeConfig() const noexcept -> RealtimeConfig = 0;

话虽如此,这并不是什么“现代化”。 [[nodiscard]] 可能很有用,但有些编译器会忽略它,因为它们不需要做任何事情。 nodiscard 关键字在 imo 中更有意义,但标准 atm 不考虑这一点。

【讨论】:

    【解决方案2】:

    要将有效的 C++11 代码转换为有效的 C++17 代码,您只需什么都不做。您所看到的是风格建议。如果它没有坏,就不要修理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-15
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多