Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.92
Bers
Заблокирован
#1

Возвращение ссылки на локальный объект - C++

14.05.2012, 22:00. Просмотров 6444. Ответов 45
Метки нет (Все метки)

Цитата Сообщение от Toshkarik Посмотреть сообщение
Что за бред, приписывайте, пожалуйста, в конце, что это только Ваше мнение. Хоть и бредовое.

C++
1
2
3
4
5
6
int& foo()
{
    int a;
    //: warning C4172: возвращение адреса локальной или временной переменной
    return a;  
}
Компиляторы подобный бред ловят без проблем. Технически препятствий не существует. Назови хоть одну реальную причину, по которой сие разрешено стандартом?
 Комментарий модератора 
Спор родился тут
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2012, 22:00     Возвращение ссылки на локальный объект
Посмотрите здесь:
C++ Возвращение ссылки на локальный объект
Возвращение const ссылки на временный объект C++
Возвращение ссылки из функции C++
C++ Возвращение ссылки на локальную переменную
Локальный объект C++ Builder
C++ Возвращение ссылки или указателя на закрытый элемент класса.
C++ Возвращение ссылки на указатель использование её как левостороннего значения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 00:34     Возвращение ссылки на локальный объект #16
Цитата Сообщение от lazybiz Посмотреть сообщение
если переменная в функции определена как static, то она является глобальной
Вот это уже бред, переменная является локальной, и создается она при первом вызове функции и существует до конца программы. Единственный к ней доступ из вне - это присвоить ее адрес какому либо указателю. И ее как раз можно возвращать по ссылке.
Что касается автоматических переменных, то получается примерно такое:
C++
1
2
3
4
5
6
7
8
9
int *a = new int;
 
*a = 3;
 
int *b = a;
 
delete a;
 
std::cout << *b << std::endl;
Bers
Заблокирован
15.05.2012, 00:42  [ТС]     Возвращение ссылки на локальный объект #17
Цитата Сообщение от lazybiz Посмотреть сообщение
+ если переменная в функции определена как static, то она является глобальной (надеюсь это знает большинство), так почему же функция не может возвращать ссылку на нее!?
1. Любой промышленный компилятор сразу палит, если функция возвращает не_валидную ссылку, и выбрасывает предупреждение.

2. Любой промышленный компилятор ни слова не скажет, если функция возвращает валидную ссылку (в том числе, на статические данные, либо временный объект, который вернулся по константной ссылке)

3. Назови хоть одну причину, по по которой может понадобиться возвращать ссылку на не_валидные данные? Зачем это может быть нужно?

4. Любые ошибки времени компиляции здорово экономят время (деньги) на отладке. И уж коли для компиляторов не существует технических препятствий, то почему стандарт разрешает компиляторам пропускать заведомо не корректный код?

5. Не путай статические данные с локальными.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 00:48     Возвращение ссылки на локальный объект #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
переменная является локальной, и создается она при первом вызове функции и существует до конца программы.
Да что ты говоришь. Посмотри на результат выполнения этой программы, и как следует изучи ее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int &foo()
{
    static int a = 10;
    printf( "%d\n", a );
    return a;
}
 
int main()
{
    int &a = foo();
    a++;
    foo();
    return 0;
}
Так же советую тебе взять еще и дизассемблер (лучше IDA), и убедиться в том что это глобальная переменная.
Bers
Заблокирован
15.05.2012, 00:49  [ТС]     Возвращение ссылки на локальный объект #19
Цитата Сообщение от Toshkarik Посмотреть сообщение
переменная является локальной, и создается она при первом вызове функции
Статические переменные являются статическими, а не локальными (Кэп намекает).
И создаются они ещё при запуске процесса. (грубо говоря до входа в точку main).
Процесс создания такой переменной - выделение памяти, и не более того. Информация о том, сколько понадобится памяти находится в бинарном файле запускаемой программки.

При первом запуске функции статические переменные инициализируются. (получают начальные значения)

Для тяжелых типов данных, это означает, что пока функция не будет запущена, не будет потрачено время на инициализацию её статических данных, и не более того.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 00:51     Возвращение ссылки на локальный объект #20
Цитата Сообщение от Bers Посмотреть сообщение
Статические переменные являются статическими, а не локальными
Дейтелы имеют другое мнение. И, мне кажется, они более компетентны.
Существует два типа идентификаторов со статическим классом памяти —
внешние идентификаторы (такие, как глобальные переменные и глобальные
имена функций) и локальные переменные, объявленные со спецификатором
класса памяти static.
Локальные переменные, объявленные с ключевым словом static, все равно
известны только в той функции, где они объявлены, но в отличие от
автоматических переменных сохраняют значения и после того, как функции возвратит
управление своему вызывающему.
Bers
Заблокирован
15.05.2012, 00:52  [ТС]     Возвращение ссылки на локальный объект #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Дейтелы имеют другое мнение.
Дейтлы объясняют что такое класс памяти static?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 00:54     Возвращение ссылки на локальный объект #22
Цитата Сообщение от Bers Посмотреть сообщение
Дейтлы объясняют что такое класс памяти static?
Именно так. Глава называется "Классы памяти".
Bers
Заблокирован
15.05.2012, 01:01  [ТС]     Возвращение ссылки на локальный объект #23
Цитата Сообщение от Toshkarik Посмотреть сообщение
Именно так. Глава называется классы памяти.
Тогда ты знаешь, что область видимости статической переменной не имеет никакого отношения ни к времени жизни этой переменной, ни к стеку.

Речь же идет о том, что компиляторы прекрасно видят факт возвращения ссылки на локальный объект. Созданный на стеке (если тебе нужны такие уточнения).

Но при этом, пропускают такой код.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:06     Возвращение ссылки на локальный объект #24
Цитата Сообщение от Bers Посмотреть сообщение
1. Любой промышленный компилятор сразу палит, если функция возвращает не_валидную ссылку, и выбрасывает предупреждение.
так и есть
Цитата Сообщение от Bers Посмотреть сообщение
//: warning C4172: возвращение адреса локальной или временной переменной
Цитата Сообщение от Bers Посмотреть сообщение
3. Назови хоть одну причину, по по которой может понадобиться возвращать ссылку на не_валидные данные? Зачем это может быть нужно?
Я не говорил что это может понадобиться, я сказал что это можно сделать и компилятор возвращает предупреждение на это. Все верно.

Цитата Сообщение от Bers Посмотреть сообщение
4. Любые ошибки времени компиляции здорово экономят время (деньги) на отладке. И уж коли для компиляторов не существует технических препятствий, то почему стандарт разрешает компиляторам пропускать заведомо не корректный код?
Еще раз... Он об этом предупреждает! Идиот тот кто пишет!

Цитата Сообщение от Bers Посмотреть сообщение
5. Не путай статические данные с локальными.
Никогда не путал. Прекрасно представляю в чем разница. Похоже даже лучше чем ты.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
15.05.2012, 01:09     Возвращение ссылки на локальный объект #25
+ если переменная в функции определена как static, то она является глобальной (надеюсь это знает большинство), так почему же функция не может возвращать ссылку на нее!?
Имеется ввиду что то типо этого?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using namespace std;
 
int &gen(int &c) // c - чисто для проверки
 {
 static int i=0;
 c=i;
 i++;
 return i;
 }
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
int c;
 
gen(c);
cout<<c<<endl;
gen(c);
cout<<c<<endl;
gen(c)=0; // обнуление
cout<<c<<endl;
gen(c);
cout<<c<<endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:15     Возвращение ссылки на локальный объект #26
Цитата Сообщение от Avazart Посмотреть сообщение
Имеется ввиду что то типо этого?
Да, что-то вроде.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 01:16     Возвращение ссылки на локальный объект #27
Цитата Сообщение от Bers Посмотреть сообщение
никакого отношения
Я и не говорил ничего подобного. Я лишь сказал, что локальная переменная на то и локальная, что к ней можно непосредственно обращаться по имени только в определенных местах, в данном случае в пределах функции, или, более широко, в пределах первых внешних фигурных скобок.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
15.05.2012, 01:16     Возвращение ссылки на локальный объект #28
Да, что-то вроде.
Ну тогда это имеет смысл не смотря на то что это можно реализовать иначе что для с++ норма
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 01:18     Возвращение ссылки на локальный объект #29
Цитата Сообщение от lazybiz Посмотреть сообщение
Да, что-то вроде.
Вам уже ответили, что возвращать ссылку на статический объект можно, ни компилятор ни стандарт "не будет против".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 01:22     Возвращение ссылки на локальный объект
Еще ссылки по теме:
C++ Возврат указателя на локальный объект
Возвращение значения в функции, ссылки, вычислить корни квадратного уравнения C++
Ссылки на объект и мультипоточность C++
Сохранение ссылки на объект в векторе C++
Разъясните ситуацию с возвратом объекта или ссылки на объект C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:22     Возвращение ссылки на локальный объект #30
Цитата Сообщение от Avazart Посмотреть сообщение
Ну тогда это имеет смысл не смотря на то что это можно реализовать иначе что для с++ норма
Не понял о чем ты. Без пунктуации читать невозможно.

Добавлено через 1 минуту
Toshkarik, спасибо, кэп!
Yandex
Объявления
15.05.2012, 01:22     Возвращение ссылки на локальный объект
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru