Die Aktien Beispiel einer Referenzqualifizierten Memberfunktion scheint so etwas zu sein:const-Referenz qualifizierte Memberfunktion
#include <stdio.h>
#include <stdexcept>
#include <string>
// Easy access to literals
using namespace std::literals;
// File wrapper
class File {
private:
// The wrapped file
FILE *_file;
public:
File(const char *name) :
_file(fopen(name, "r")) {
// unable to open the file?
if (!_file) throw std::runtime_error{ "Unable to open file: "s + name };
}
~File() {
fclose(_file);
}
// Convert to the underlying wrapped file
operator FILE *() & {
return _file;
}
// TODO: Member functions for working with the file
};
Diese gut funktioniert. Es ist nicht möglich, den zugrunde liegenden FILE-Zeiger direkt von einem unbenannten temporären Objekt abzurufen. Wenn wir jedoch den Casting-Operator auch const-qualifiziert machen, scheint das nicht mehr zu funktionieren.
Verschiedene Compiler einfach schlucken es ohne Beschwerde, obwohl es eine sehr nützliche Idee ist. Nehmen wir zum Beispiel die Memberfunktion std :: string :: c_str(). Sie denken, es sollte Referenz-qualifiziert sein (weil Sie sonst einen ungültigen Zeiger haben), aber es ist nicht.
Ist das ein Loch in der C++ 11-Norm? Fehle ich hier etwas?
Kannst du den Code ein wenig dichter machen? Es ist mehr als eine Seite für 2 Methoden – user463035818
Die 'c_str()' ist nützlich in einem Parameter, auch wenn es eine temporäre ist. In 'f (g(). C_str());' die begrenzte Lebensdauer kann in Ordnung sein. –
Nebenbei: Nicht alle r-Wert-Referenzen sind Provisorien. – Hurkyl