Как преобразовать виртуальную функцию с const noexcept из c ++ 11 в c ++ 17? - PullRequest
0 голосов
/ 10 марта 2020

Я уверен, что это простой вопрос для гуру с ++ 17 здесь. Я пытаюсь модернизировать некоторые c ++ 11 до gnu ++ 17, используя clang-tidy с clang-9 и запутываясь в том, что clang-tidy указывает на исправление и как его исправить.

Вот некоторые исходного кода в заголовочном файле

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

clang-tidy *

'realtimeConfig' должно быть помечено [[nodiscard]]

предупреждение: используйте конечный тип возврата для этой функции

virtual RealtimeConfig realtimeConfig () const noexcept = 0;

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

Я прочитал документацию здесь CPP но я не понимаю, какова цель следующего

const noexcept = 0;

кажется, что нечего бросать так как это что то вернуть? и так, что мне нужно сделать, чтобы пройти clang-tidy?

Если это неправильное место для этого вопроса, дайте мне знать, чтобы я мог переместить его.

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Первое предупреждение говорит вам использовать атрибут 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 имело бы гораздо больший смысл, но это не учитывается для стандартного atm.

1 голос
/ 10 марта 2020

Чтобы преобразовать ваш действительный код C ++ 11 в действительный код C ++ 17, все, что вам нужно сделать, это ничто . То, что вы видите, это совет по стилю . Если это не сломано, не исправляйте это.

...