Namespaces
Variants

std::experimental:: make_unique_resource_checked

From cppreference.net
Определено в заголовочном файле <experimental/scope>
template < class R, class D, class S = std:: decay_t < R > >

std :: experimental :: unique_resource < std:: decay_t < R > , std:: decay_t < D >>
make_unique_resource_checked ( R && r, const S & invalid, D && d )

noexcept ( /*see below*/ ) ;
(Technical Specification v3 библиотеки fundamentals)

Создает unique_resource , инициализируя сохраненный дескриптор ресурса с помощью std:: forward < R > ( r ) и его удалитель с помощью std:: forward < D > ( d ) . Созданный unique_resource владеет ресурсом тогда и только тогда, когда bool ( r == invalid ) равно false .

Программа является некорректной, если выражение r == invalid не может быть контекстно преобразовано в bool , и поведение не определено, если преобразование приводит к неопределенному поведению или выбрасывает исключение.

Содержание

Примечания к переводу: - HTML-теги и атрибуты сохранены без изменений - Текст в тегах ` `, `
`, `` не переводился (в данном фрагменте их нет)
- C++ специфические термины сохранены в оригинале
- Исправлены опечатки в оригинальном тексте ("Paramaters" → "Параметры", "Reture" → "Возвращаемое")

Параметры

r - дескриптор ресурса
d - удалитель для освобождения ресурса
invalid - значение, указывающее что дескриптор ресурса недействителен

Возвращаемое значение

A unique_resource описанный выше.

Исключения

Любое исключение, выброшенное при инициализации сохранённого дескриптора ресурса и удалителя.

Примечания

make_unique_resource_checked существует для предотвращения вызова функции-деструктора с недопустимым аргументом.

Дескриптор ресурса r либо копируется, либо перемещается в возвращаемое значение, и созданный unique_resource всегда содержит базовый дескриптор ресурса с типом объекта.

Пример

#include <cstdio>
#include <experimental/scope>
int main()
{
    // избежать вызова fclose при неудачном fopen
    auto file = std::experimental::make_unique_resource_checked(
        std::fopen("potentially_nonexistent_file.txt", "r"),
        nullptr,
        [](std::FILE *fptr) { std::fclose(fptr); }
    );
    if (file.get())
        std::puts("The file exists.");
    else
        std::puts("The file does not exist.");
}

Возможный вывод:

The file does not exist.

Смотрите также