2013-10-08 3 views
0

Может кто-нибудь сказать мне ли это безопасно и определил:Безопасно ли устанавливать ссылки в следующем порядке


class RefClass 
{ 
public: 
    RefClass(int i) { this->i = i; } 
    int& GetRef() { return i; } 
private: 
    int i; 
}; 


RefClass rc(10); 

int* refp; 

{ 
    refp = &rc.GetRef(); 
} 

*refp = 20; 

В частности меня интересует жизни возвращенного ссылки вложенной области и может ли она ссылаться в этой области, а затем будет разыменоваться как lvalue после того, как эта область исчезнет.

Этот код компилируется и работает как ожидается в VS2012, но это не значит, что он будет в следующей версии, поэтому я пытаюсь найти окончательный ответ.

ответ

1

Да, это нормально.

Возвращенная ссылка является временной, продолжающейся до конца оператора, содержащего вызов функции. Он используется в течение своей жизни, чтобы установить refp, чтобы указать на его цель, rc.i. После этого не нужно разыгрывать указатель.

Единственная опасность в том случае, если объект может быть уничтожен, в результате чего указатель оборванных:

int* refp; 

{ 
    RefClass rc(10); 
    refp = &rc.GetRef(); 
} // rc is destroyed here 

*refp = 20; // BOOM!!! 
1

Да, все в порядке. У вас возникнут проблемы в следующем случае:

int* refp; 

{ 
    RefClass rc(10); 
    refp = &rc.GetRef(); 
} 

*refp = 20; 
+0

ваш ответ тоже правильно, но дает кредит на другой ответ на более объяснения. –

Смежные вопросы