Ich versuche festzustellen, ob eine C++ - Funktion so deklariert werden kann, dass der Rückgabewert nicht ignoriert werden kann (idealerweise zur Kompilierzeit erkannt). Ich habe versucht, eine Klasse mit einer private
(oder in C++ 11, delete
d) operator void()
zu deklarieren, um zu versuchen, die implizite Konvertierung zu void zu fangen, wenn ein Rückgabewert nicht verwendet wird.Kann eine C++ - Funktion so deklariert werden, dass der Rückgabewert nicht ignoriert werden kann?
Hier ist ein Beispiel-Programm:
class Unignorable {
operator void();
};
Unignorable foo()
{
return Unignorable();
}
int main()
{
foo();
return 0;
}
Leider ist mein Compiler (Klirren-703.0.31) sagt:
test.cpp:2:5: warning: conversion function converting 'Unignorable' to 'void' will never be used
operator void();
^
und erheben keinen Fehler oder eine Warnung auf dem Aufruf von foo()
. Also, das wird nicht funktionieren. Gibt es einen anderen Weg, dies zu tun? Antworten speziell für C++ 11 oder C++ 14 oder später wären in Ordnung.
Laufzeit oder Kompilierzeit? –
http://stackoverflow.com/questions/12692892/force-returned-object-to-be-assigned –
Sind Sie sicher, dass eine implizite Konvertierung in "void" vorliegt? Ich kann nichts im Standard darüber finden. (Aber ich bin nicht einmal sicher, was konvertiert werden würde.) AFAIK, alles was passiert, wenn der Rückgabewert keinen "Empfänger" hat, ist die Konstruktion und Zerstörung eines temporären Objekts. – molbdnilo