Атрибут C++: nodiscard (с C++17)
Если функция, объявленная nodiscard или функция, возвращающая перечисление или класс, объявленный nodiscard по значению, вызывается из выражения с отбрасываемым значением, отличного от приведения к void, компилятор должен выдать предупреждение.
Синтаксис
[[nodiscard]] | (1) | |
[[nodiscard( строковая литерал )]] | (2) | (с C++20) |
| строковая литерал | - | невычисляемая строковая литерал, которая может использоваться для объяснения причины, по которой результат не должен отбрасываться |
Объяснение
Используется в объявлении функции, перечисления или класса.
Если из выражения с отбрасываемым значением, отличного от приведения к void,
- вызывается функция, объявленная
nodiscard, или - вызывается функция, возвращающая перечисление или класс, объявленный
nodiscardпо значению, или - вызывается конструктор, объявленный
nodiscardс помощью явного приведения типов илиstatic_cast, или - объект типа перечисления или класса, объявленного
nodiscardинициализируется с помощью явного приведения типов илиstatic_cast,
компилятор должен выдать предупреждение.
| Строковая литерал, если указана, обычно включается в предупреждения. | (с C++20) |
Пример
struct [[nodiscard]] error_info { /*...*/ };
error_info enable_missile_safety_mode() { /*...*/ return {}; }
void launch_missiles() { /*...*/ }
void test_missiles()
{
enable_missile_safety_mode(); // compiler may warn on discarding a nodiscard value
launch_missiles();
}
error_info& foo() { static error_info e; /*...*/ return e; }
void f1() { foo(); } // nodiscard type is not returned by value, no warning
// nodiscard( string-literal ) (since C++20):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }
int main()
{
strategic_value(4, 2); // compiler may warn on discarding a nodiscard value
auto z = strategic_value(0, 0); // ok: return value is not discarded
return z;
}Возможный вывод:
game.cpp:5:4: warning: ignoring return value of function declared with 'nodiscard' attribute game.cpp:17:5: warning: ignoring return value of function declared with 'nodiscard' attribute: PURE FUN
Стандартная библиотека
Следующие стандартные функции объявляются с атрибутом nodiscard.
Функции выделения памяти |
|
| функции выделения памяти (функция) |
|
| выделяет неинициализированное хранилище (публичный член-функция std::allocator<T>) |
|
|
[статический] | выделяет неинициализированное хранилище с помощью аллокатора (публичная статическая член-функция std::allocator_traits<Alloc>) |
| выделяет память (публичный член-функция std::pmr::memory_resource) |
|
| выделяет память (публичный член-функция std::pmr::polymorphic_allocator<T>) |
|
| выделяет неинициализированное хранилище, используя внешний аллокатор (публичный член-функция std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...>) |
|
Непосредственный доступ |
|
|
(C++17) | барьер оптимизации указателей (шаблон функции) |
|
(C++20) | сообщает компилятору, что указатель выровнен (шаблон функции) |
Функции проверки пустоты |
|
|
(C++17) | проверяет, пуст ли контейнер (шаблон функции) |
| проверяет, пуст ли обработчик узла (публичный член-функция node handle) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::array<T,N>) |
|
| проверяет, пуста ли строка (публичный член-функция std::basic_string<CharT,Traits,Allocator>) |
|
| проверяет, пуста ли область просмотра (публичный член-функция std::basic_string_view<CharT,Traits>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::deque<T,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::forward_list<T,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::list<T,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::map<Key,T,Compare,Allocator>) |
|
| проверяет, произошла ли успешная проверка совпадения (публичный член-функция std::match_results<BidirIt,Alloc>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::multimap<Key,T,Compare,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::multiset<Key,Compare,Allocator>) |
|
| проверяет, пуст ли адаптер контейнера (публичный член-функция std::priority_queue<T,Container,Compare>) |
|
| проверяет, пуст ли адаптер контейнера (публичный член-функция std::queue<T,Container>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::set<Key,Compare,Allocator>) |
|
| проверяет, пуста ли последовательность (публичный член-функция std::span<T,Extent>) |
|
| проверяет, пуст ли адаптер контейнера (публичный член-функция std::stack<T,Container>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::unordered_map<Key,T,Hash,KeyEqual,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::unordered_multiset<Key,Hash,KeyEqual,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::unordered_set<Key,Hash,KeyEqual,Allocator>) |
|
| проверяет, пуст ли контейнер (публичный член-функция std::vector<T,Allocator>) |
|
| проверяет, пуст ли путь (публичный член-функция std::filesystem::path) |
|
Разное |
|
|
(C++11) | выполняет функцию асинхронно (возможно, в новой потоке) и возвращает std::future , который будет содержать результат (шаблон функции) |
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| P1771R1 | C++17 |
[[nodiscard]] на конструкторах не имеет никакого эффекта | может вызвать предупреждение, если созданный объект отбрасывается |
См. также
|
(C++11) | Заполнитель для пропуска элемента при распаковке tuple с помощью tie (константа) |
Документация C для nodiscard |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/attributes/nodiscard