5

Для примера написал такой класс:

class TestClass {
public:
    char v(const std::string& str) const {
        return str[0];
    }
};

Компилятор хочет, чтобы я пометил функцию v атрибутом [[nodiscard]]:
Clang-Tidy: Function 'v' should be marked [[nodiscard]].
Почему? Какие последствия будут в зависимости от того, помечу я её или нет?

AvidCoder
  • 2,808
  • а можно узнать, что это за компилятор и послушать его версию событий? – Fat-Zer Mar 05 '21 at 02:35
  • @Fat-Zer я неправильно выразился. Не компилятор, а CLion. Пишет: Clang-Tidy: Function 'v' should be marked [[nodiscard]]. – AvidCoder Mar 05 '21 at 02:42
  • а флаги? на godbolt'е ни как не ругается... – Fat-Zer Mar 05 '21 at 02:47
  • 2
    вероятно, просто видит, что у функции нет ни каких побочных эффектов и решает, что её значение всегда должно использоваться, дабы избежать ошибок при случайном удалении foo= в foo=tc.v("bar"); – Fat-Zer Mar 05 '21 at 02:50
  • 2
    нуда, примерно так и есть, критерии чтобы он начал рекомендовать см. здесь: https://clang.llvm.org/extra/clang-tidy/checks/modernize-use-nodiscard.html – Fat-Zer Mar 05 '21 at 02:56
  • @Fat-Zer ну и хорошо. Я думал, вдруг это что-то важное. Спасибо. – AvidCoder Mar 05 '21 at 03:05
  • @Fat-Zer хорошо бы оформить ответом. – αλεχολυτ Mar 05 '21 at 07:20
  • @ИмяФамилия по аттрибутам можете ещё тут почитать. – αλεχολυτ Mar 05 '21 at 07:21
  • @αλεχολυτ, в ближайшее время у меня похоже не дойдут руки... я не против, если кто-то другой оформит... – Fat-Zer Mar 06 '21 at 23:10

1 Answers1

4

На основании упомянутой в комментарии ссылки clang-tidy (используемый в CLion) предлагает добавить атрибут [[nodiscard]] к функции, т.к. функция подходит под перечисленный список условий. Суть условий в том, что видимое поведение функции может быть доступно только через возвращаемый результат. Если его проигнорировать, то такая функция будет выглядеть бесполезной. Чтобы этого избежать как раз существует упомянутый атрибут.

Подробнее о существующих атрибутах C++ можно почитать здесь.

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119