TResult Func (TParams Params); // Функция возвращает объект
//....
void Main_Func ()
{[INDENT]TResult &Res = Func (...); // Объявление ссылки на результат функции
// .....
[/INDENT]}
Ссылки на результат функции
Как будет реализована следующая ситуация.
Код:
Вопросы:
1. Будет ли работать такой код вообще. Не получится ли, что результат функции будет удалён из стека после выполнения присваивания?
2. Если объект будет оставлен в стеке до выхода ссылки из области видимости, то как к нему будет производиться обращение?
Произойдёт ли именование безымянной ранее области стека без создания ссылки (имя ссылки будет соответствовать адресу результата функции). Или же сама ссылка станет отдельным объектом, а обращение к объекту будет производиться по адресу, содержащемуся в ссылке.
Код:
int Func() {
return 8;
}
int main() {
int &Res = Func();
return Res;
}
return 8;
}
int main() {
int &Res = Func();
return Res;
}
reslink.cpp: In function `int main()':
reslink.cpp:6: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'
на вопрос ответил?
Так компилится и работает:
Код:
int shitfunc()
{
return 0xDEADBEEF;
};
int main()
{
const int& res=shitfunc();
std::cout<<std::hex<<res<<std::endl;
return 0;
};
{
return 0xDEADBEEF;
};
int main()
{
const int& res=shitfunc();
std::cout<<std::hex<<res<<std::endl;
return 0;
};
А вот без const не компилится.
Для небазовых типов привязка ссылки ко временному объекту проходит нормально и без const.
1. В некоторых случаях в строке объявления/присвоения ссылки наблюдалось warning-сообщение :confused: : "Temporary used to initialize 'ref'" - в основном, при наличии в коде попытки изменения объекта.
2. Несмотря на сообщение, глюков при выполнении не наблюдалось :)
3. Вызов деструктора для сложных объектов происходит автоматически при выходе из из области видимости ссылки.
4. Однако строка ref.Value++ (Value - поле типа int) выглядит как
Код:
mov eax, [ebp-0x44]
inc dword ptr [eax+0x04]
inc dword ptr [eax+0x04]
Надеюсь, господа "асматики" скажут, что именно происходит в этих строках. Но на мой взгляд, наблюдается прямое обращение к объекту, расположенному со смещением 44h относительно границы стека, а не тратится лишняя команда для адресации через ссылку.