Edit: Tja, das war wohl eine schreckliche Idee.
Ist es möglich, einen intelligenten Verweis in C++ (für eine bestimmte Klasse, da Sie den Operator . nicht überladen können) mit der gleichen Semantik wie eine normale C++-Referenz zu machen, aber das ist reseated, wenn in einem STL-Container verwendet?
Zum Beispiel, wenn ich einige int_ref
Klasse mit den normalen Ganzzahloperatoren überladen, und Konstruktion und Zuweisung sehen wie folgt aus:
class int_ref{
int * p;
public:
int_ref(int * ip) : p(ip) {}
int_ref(const int_ref & other) : p(other.p) {
/* maybe some refcounting stuff here */
}
int_ref & operator = (const int_ref & other){
if (!p)
throw something_bad();
*p = *other.p;
return *this;
}
void reseat(const int_ref & other){
p = other.p;
}
}
Dann kann ich das nicht mit std::vector
da die Referenzen nicht wiederhergestellt werden, und das möchte ich nicht:
std::vector<int_ref> vec;
int_ref five = new int(5);
vec.push_back(five);
vec.push_back(new int(1));
std::sort(vec.begin(), vec.end()); // the value of five is now 1
Ich kann rvalue-Referenzen verwenden, damit es mit der STL zusammenpasst,
int_ref & operator=(int_ref && other){
reseat(other);
return *this;
}
Aber dann wird eine Funktion, die eine int_ref
würde die rvalue-Überladung verwenden, und ich würde dies erhalten:
int_ref make_number(){
return new int(10);
}
int_ref ref = new int(5);
int_ref other = ref;
other = make_number(); // instead of copying, as a reference would,
// other now points to something other than ref
Gibt es eine Möglichkeit, dies zu umgehen? Ist das generell eine schreckliche Idee?