Przykładowy czas z funkcji członka odniesienia kwalifikacjach wydaje się być coś takiego:const odniesienie funkcja wykwalifikowany członek
#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
};
Działa to dobrze. Nie jest możliwe bezpośrednie pobranie bazowego wskaźnika PLIKu z nienazwanego tymczasowego. Jeśli jednak udostępnimy operatorowi odlewania, nie będzie to już działać.
Różne kompilatory po prostu połknąć bez skargi, mimo że jest to bardzo przydatne rozwiązanie. Weźmy na przykład funkcję członka std :: string :: c_str(). Czujesz, że powinien być kwalifikowany referencyjnie (ponieważ w przeciwnym razie masz nieprawidłowy wskaźnik), ale tak nie jest.
Czy to jest dziura w standardzie C++ 11? Czy coś mi umyka?
Nie możesz sprawić, by kod był trochę bardziej gęsty? To więcej niż strona dla 2 metod. – user463035818
Funkcja 'c_str()' jest użyteczna w parametrze, nawet jeśli jest tymczasowa. W 'f (g(). C_str());' ograniczone życie może być w porządku. –
Na marginesie: nie wszystkie referencje wartości r są tymczasowe. – Hurkyl