Lo stock esempio di una funzione membro di riferimento qualificato sembra essere qualcosa di simile:const riferimento funzione di membro qualificato
#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
};
Questo metodo funziona bene. Non è possibile recuperare direttamente il puntatore FILE sottostante da un temporaneo senza nome. Tuttavia, se rendiamo anche l'operatore di casting const-qualificato, questo sembra non funzionare più.
Diversi compilatori semplicemente lo inghiottono senza lamentarsi anche se è un'idea terribilmente utile. Prendi, ad esempio, la funzione membro std :: string :: c_str(). Si ritiene che dovrebbe essere qualificato come riferimento (perché altrimenti si dispone di un puntatore non valido) eppure non lo è.
Si tratta di un buco nello standard C++ 11? Mi sto perdendo qualcosa qui?
non riesci a rendere il codice un po 'più denso? È più di una pagina per 2 metodi – user463035818
Il 'c_str()' è utile in un parametro, anche se è temporaneo. In 'f (g(). C_str());' la durata limitata può essere ok. –
A parte: non tutti i riferimenti di valore r sono temporanei. – Hurkyl