предотвращение передачи по ссылке временного объекта

У меня есть класс, который «запоминает» ссылку на некоторый объект (например, целочисленную переменную) . Я не могу, чтобы он ссылался на значение, которое немедленно уничтожается, и я ищу способ защитить пользователей моего класса от случайных действий.

Является ли перегрузка rvalue-reference хорошим способом предотвращения передачи временного объекта?

struct HasRef {
    int& a;
    HasRef(int& a):a(a){}
    void foo(){ a=1; }
};


int main(){
    int x=5;
    HasRef r1(x);
    r1.foo();  // works like intended.

    HasRef r2(x+4);
    r2.foo(); // dereferences the temporary created by x+4

 }

Подойдет ли приватная перегрузка rvalue?

 struct HasRef {
   int& a;
   HasRef( int& a ):a(a){}
   void foo(){ a=1; }
 private: 
   HasRef( int&& a );
 };

 ... HasRef r2(x+1); // doesn't compile => problem solved?

Есть какие-то подводные камни, которых я не заметил?

9
задан xtofl 20 June 2012 в 20:38
поделиться