Spec-Zone.ru › C++

Атрибут 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.

Функции выделения памяти
operator newoperator new[]
функции выделения памяти
(функция)
allocate
выделяет неинициализированное хранилище
(публичный член-функция std::allocator<T>)
allocate
[статический]
выделяет неинициализированное хранилище с помощью аллокатора
(публичная статическая член-функция std::allocator_traits<Alloc>)
allocate
выделяет память
(публичный член-функция std::pmr::memory_resource)
allocate
выделяет память
(публичный член-функция std::pmr::polymorphic_allocator<T>)
allocate
выделяет неинициализированное хранилище, используя внешний аллокатор
(публичный член-функция std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...>)
Непосредственный доступ
launder
(C++17)
барьер оптимизации указателей
(шаблон функции)
assume_aligned
(C++20)
сообщает компилятору, что указатель выровнен
(шаблон функции)
Функции проверки пустоты
empty
(C++17)
проверяет, пуст ли контейнер
(шаблон функции)
empty
проверяет, пуст ли обработчик узла
(публичный член-функция node handle)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::array<T,N>)
empty
проверяет, пуста ли строка
(публичный член-функция std::basic_string<CharT,Traits,Allocator>)
empty
проверяет, пуста ли область просмотра
(публичный член-функция std::basic_string_view<CharT,Traits>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::deque<T,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::forward_list<T,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::list<T,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::map<Key,T,Compare,Allocator>)
empty
проверяет, произошла ли успешная проверка совпадения
(публичный член-функция std::match_results<BidirIt,Alloc>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::multimap<Key,T,Compare,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::multiset<Key,Compare,Allocator>)
empty
проверяет, пуст ли адаптер контейнера
(публичный член-функция std::priority_queue<T,Container,Compare>)
empty
проверяет, пуст ли адаптер контейнера
(публичный член-функция std::queue<T,Container>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::set<Key,Compare,Allocator>)
empty
проверяет, пуста ли последовательность
(публичный член-функция std::span<T,Extent>)
empty
проверяет, пуст ли адаптер контейнера
(публичный член-функция std::stack<T,Container>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::unordered_map<Key,T,Hash,KeyEqual,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::unordered_multiset<Key,Hash,KeyEqual,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::unordered_set<Key,Hash,KeyEqual,Allocator>)
empty
проверяет, пуст ли контейнер
(публичный член-функция std::vector<T,Allocator>)
empty
проверяет, пуст ли путь
(публичный член-функция std::filesystem::path)
Разное
async
(C++11)
выполняет функцию асинхронно (возможно, в новой потоке) и возвращает std::future , который будет содержать результат
(шаблон функции)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применимо к Поведение, опубликованное Правильное поведение
P1771R1 C++17 [[nodiscard]] на конструкторах не имеет никакого эффекта может вызвать предупреждение, если созданный объект отбрасывается

См. также

ignore
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API