Может ли кто-нибудь сказать мне, является ли это безопасным и определенным:
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, но это не значит, что он будет в следующей версии, поэтому я пытаюсь найти окончательный ответ.
Да, это прекрасно.
Возвращенная ссылка является временной, продолжающейся до конца оператора, содержащего вызов функции. Он использовал в течение своей жизни, чтобы установить refp
чтобы указать на его цель, rc.i
После этого не нужно было разыгрывать указатель.
Единственная опасность заключается в том, что объект может быть уничтожен, оставив указатель висящим:
int* refp;
{
RefClass rc(10);
refp = &rc.GetRef();
} // rc is destroyed here
*refp = 20; // BOOM!!!
Да, все в порядке. У вас возникнут проблемы в следующем случае:
int* refp;
{
RefClass rc(10);
refp = &rc.GetRef();
}
*refp = 20;