std::experimental::make_unique_resource_checked
| 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>> |
(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.
std::is_nothrow_constructible_v<std::decay_t<R>, R> &&
std::is_nothrow_constructible_v<std::decay_t<D>, D>
[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.