nodiscard

Структуры и классы могут быть помечены флагом nodiscard. Возвращаемое значение типа с этим флагом нельзя игнорировать - нужно его использовать, передав куда-то дальше или инициализировать им переменную.

struct SomeStruct nodiscard { i32 x; }
fn Bar() : SomeStruct;
fn Foo()
{
    Bar(); // Ошибка - игнорируется значение "nodiscard" типа.
}

Для классов флаг nodiscard указывается после возможных вида класса и списка родительских классов:

class SomeInterface interface {}
class SomeClass final : SomeInterface nodiscard {}

Также как nodiscard могут быть помечены перечисления:

enum Ampel nodiscard { Rot, Gelb, Gruen }
enum Richtungen : u32 nodiscard { Nord, Sued, Ost, West }

nodiscard для функций

Функции также могут быть помечены как nodiscard. Результат вызова таких функций (значение или ссылку) необходимо использовать.

fn nodiscard Bar() : i32;
fn Foo()
{
    Bar(); // Ошибка - игнорируется "nodiscard" значение.
}

Лямбды тоже могут быть помечены как nodiscard

fn Foo()
{
    auto f= lambda nodiscard () : i32 { return 654; };
    f(); // Ошибка - игнорируется "nodiscard" значение.
}

nodiscard имеет смысл указывать для функций, которые имеют сторонние эффекты и возвращаемое значение которых должно быть использовано. Для функций без сторонних эффектов nodiscard в общем то не нужен, т. к. игнорировать их результат не имеет смысла. Для функций со сторонними эффектами, где результат может быть отброшен, nodiscard тоже не нужен.

nodiscard для временных переменных

Переменные, полученные через вызов конструктора в контексте выражения, помечаются как nodiscard.

fn Foo( i32 x )
{
    u32( x ); // Ошибка - игнорируется "nodiscard" значение типа "u32".
}