Namensräume
Varianten
Aktionen

std::experimental::make_unique_resource_checked

Von cppreference.com
 
 
 
 
 
Definiert in Header <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(/*siehe unten*/);
(library fundamentals TS v3)

Erzeugt eine unique_resource, initialisiert ihr gespeichertes Ressourcen-Handle mit std::forward<R>(r) und ihren Deleter mit std::forward<D>(d). Die erzeugte unique_resource besitzt die Ressource genau dann, wenn bool(r == invalid) false ist.

Das Programm ist schlecht geformt, wenn der Ausdruck r == invalid nicht in bool kontextuell konvertiert werden kann, und das Verhalten ist undefiniert, wenn die Konvertierung zu undefiniertem Verhalten führt oder eine Ausnahme auslöst.

Inhalt

[bearbeiten] Parameter

r - ein Ressourcen-Handle
d - ein Deleter zum Freigeben der Ressource
ungültig - ein Wert, der angibt, dass das Ressourcen-Handle ungültig ist

[bearbeiten] Rückgabewert

Eine wie oben beschriebene unique_resource.

[bearbeiten] Ausnahmen

Jede Ausnahme, die bei der Initialisierung des gespeicherten Ressourcen-Handles und des Deleters ausgelöst wird.

noexcept-Spezifikation:  

[bearbeiten] Hinweise

make_unique_resource_checked existiert, um zu vermeiden, dass eine Deleter-Funktion mit einem ungültigen Argument aufgerufen wird.

Das Ressourcen-Handle r wird in den Rückgabewert kopiert oder dorthin verschoben, und die erzeugte unique_resource enthält immer ein zugrunde liegendes Ressourcen-Handle vom Objekttyp.

[bearbeiten] Beispiel

#include <cstdio>
#include <experimental/scope>
 
int main()
{
    // avoid calling fclose when fopen fails
    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.");
}

Mögliche Ausgabe

The file does not exist.

[bearbeiten] Siehe auch