Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно ли возвращать ссылку на параметр функции / 25 сообщений из 35, страница 1 из 2
28.10.2017, 15:35
    #39543689
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
Навеяно предыдущим топиком. Корректно ли возвращать ссылку на **ссылочный** параметр функции?

Вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
int const &foo(int const &a)
{
    return a;
}

int const &f = foo(3); 


По сути дела мы возвращаем ссылку на временную переменную. Но в данном случае константную.

Это всё выглядит как баг, но ни один компилятор на моей памяти не заорал варнингами.
...
Рейтинг: 0 / 0
28.10.2017, 15:54
    #39543695
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
Но, в общем, это может быть и корректным:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct Foo
{
    Foo &operator=(int);
};

Foo &convert(Foo &a)
{
    return a;
}

Foo f;
convert(f) = 6;
...
Рейтинг: 0 / 0
28.10.2017, 16:26
    #39543698
Корректно ли возвращать ссылку на параметр функции
petravНавеяно предыдущим топиком. Корректно ли возвращать ссылку на **ссылочный** параметр функции?

Вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
int const &foo(int const &a)
{
    return a;
}

int const &f = foo(3); 

Возвращать корректно, а использовать f — нет.

petravПо сути дела мы возвращаем ссылку на временную переменную.В данном коде — да.
petravНо в данном случае константную.А это какую роль играет?
petravЭто всё выглядит как баг, но ни один компилятор на моей памяти не заорал варнингами.И?
...
Рейтинг: 0 / 0
28.10.2017, 16:29
    #39543699
вЪю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
petrav, компилятор нынче умный пошёл . у foo параметр ссылка. значит должна быть где то переменная (константа) в памяти на которую эта ссылка работает.
...
Рейтинг: 0 / 0
28.10.2017, 16:37
    #39543702
Корректно ли возвращать ссылку на параметр функции
вЪюкомпилятор нынче умный пошёл А его использующие?
Что, например, об этом можно сказать?
(Кстати, там и варнинг есть. Только кривоватый.)
...
Рейтинг: 0 / 0
28.10.2017, 16:54
    #39543707
вЪю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
Приплюснутый,

слишком умный компилятор иногда может сходить с ума. особенно если ему это разрешить (-O)
...
Рейтинг: 0 / 0
28.10.2017, 16:55
    #39543709
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
ПриплюснутыйВозвращать корректно, а использовать f — нет.
Почему же не корректно? Удержание ссылки, так кажется это называется? Это корректно:

Код: plaintext
1.
2.
std::string getStr();
std::string &myStr = getStr();


ПриплюснутыйА это какую роль играет?
И?
Да мало ли какая там роль играется. Играется, да-да. Дело тут не в ООП и не в ООА. Мы просто рассуждаем о подвохах С++. С целью повысить свою грамотность.
...
Рейтинг: 0 / 0
28.10.2017, 16:57
    #39543711
Корректно ли возвращать ссылку на параметр функции
вЪю, а что компилятор сделал не так?
...
Рейтинг: 0 / 0
28.10.2017, 16:58
    #39543712
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
вЪюpetrav, компилятор нынче умный пошёл . у foo параметр ссылка. значит должна быть где то переменная (константа) в памяти на которую эта ссылка работает.
Ну возможно. Но ассемблера я не знаю. Хотя учил его... в школе. Прости, но твоя ссылка ничего для меня не сказала.
...
Рейтинг: 0 / 0
28.10.2017, 17:00
    #39543713
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
petravПо сути дела мы возвращаем ссылку на временную переменную.

В каком месте этого кода ты нашёл временную переменную?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.10.2017, 17:03
    #39543715
Корректно ли возвращать ссылку на параметр функции
petravУдержание ссылки, так кажется это называется?Только оно здесь не работает.
http://eel.is/c draft/class.temporary#6.9 A temporary object bound to a reference parameter in a function call persists until the completion of the full-expression containing the call.
...
Рейтинг: 0 / 0
28.10.2017, 17:04
    #39543716
вЪю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
ПриплюснутыйвЪю, а что компилятор сделал не так?
программа должна возвращать 3 а не 0
...
Рейтинг: 0 / 0
28.10.2017, 17:05
    #39543717
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
Dimitry SibiryakovpetravПо сути дела мы возвращаем ссылку на временную переменную.

В каком месте этого кода ты нашёл временную переменную?

Тут мы создаём на стеке временную переменную типа int со значением 3:
Код: plaintext
1.
foo(3);


И передаём эту переменную в функцию foo().
...
Рейтинг: 0 / 0
28.10.2017, 17:06
    #39543718
Корректно ли возвращать ссылку на параметр функции
вЪю, там UB, так что не должна.
...
Рейтинг: 0 / 0
28.10.2017, 17:15
    #39543721
вЪю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
Приплюснутый,

там нет UB.
...
Рейтинг: 0 / 0
28.10.2017, 17:16
    #39543722
Корректно ли возвращать ссылку на параметр функции
вЪютам нет UB.Голословное утверждение.
...
Рейтинг: 0 / 0
28.10.2017, 17:18
    #39543723
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
ПриплюснутыйpetravУдержание ссылки, так кажется это называется?Только оно здесь не работает.
http://eel.is/c draft/class.temporary#6.9A temporary object bound to a reference parameter in a function call persists until the completion of the full-expression containing the call.

Только что сработало в Студии 2015. Если честно, я не понял твоей цитаты на англ. Если ты пояснишь... было бы круто. Но я предполагаю, что там написано: временные переменные существуют пока выполняется выражение, а выражение заканчивается точкой с запятой.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <string>

std::string getStr(std::string const &a_str)
{
    return a_str;
}

int main(int argc, char *argv[])
{
    std::string &s = getStr("123");
}
...
Рейтинг: 0 / 0
28.10.2017, 17:23
    #39543727
вЪю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
ПриплюснутыйвЪютам нет UB.Голословное утверждение.
ты сам себе противоречишь.
...
Рейтинг: 0 / 0
28.10.2017, 17:30
    #39543730
Корректно ли возвращать ссылку на параметр функции
petravТолько что сработало в Студии 2015.Я писал про ситуацию из ОП-поста. При чём тут getStr?
petravЕсли честно, я не понял твоей цитаты на англ. Это не поможет?
...
Рейтинг: 0 / 0
28.10.2017, 17:30
    #39543731
Корректно ли возвращать ссылку на параметр функции
вЪюПриплюснутыйпропущено...
Голословное утверждение.
ты сам себе противоречишь.Второе голословное утверждение.
...
Рейтинг: 0 / 0
28.10.2017, 17:32
    #39543732
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
Так не сработало:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <string>

std::string const &getStr(std::string const &a_str)
{
    return a_str;
}

int main(int argc, char *argv[])
{
    std::string const &s = getStr("123");
}



Временная переменная закончила свою жизнь после точки с запятой. Но при этом содержимое переменной s корректное. Пустая строка. Не понятно совсем.
...
Рейтинг: 0 / 0
28.10.2017, 17:36
    #39543734
Корректно ли возвращать ссылку на параметр функции
petravВременная переменнаяЧто такое "временная переменная"? Я знаю про временные объекты.
...
Рейтинг: 0 / 0
28.10.2017, 17:38
    #39543736
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
ПриплюснутыйpetravТолько что сработало в Студии 2015.Я писал про ситуацию из ОП-поста. При чём тут getStr?
petravЕсли честно, я не понял твоей цитаты на англ. Это не поможет?
Я понял. Спасибо.
...
Рейтинг: 0 / 0
28.10.2017, 17:41
    #39543738
Корректно ли возвращать ссылку на параметр функции
petravУдержание ссылки, так кажется это называется?Ладно, без цитат из стандарта (тем более, что та цитата не совсем выражает то, что нужно).

Упрощённо говоря, время жизни временного объекта продлевается до времени жизни ссылки, к которой он биндится.
Когда оканчивается время жизни параметров функции?
...
Рейтинг: 0 / 0
28.10.2017, 17:42
    #39543740
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно ли возвращать ссылку на параметр функции
ПриплюснутыйpetravВременная переменнаяЧто такое "временная переменная"? Я знаю про временные объекты.
Объекты и есть переменные. Согласно постановлению Страуструпа С++ разрабатывался так что бы, по возможности, стереть разницу между... впрочем, мне кажется мы спорим о терминах. Путь будут объекты.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно ли возвращать ссылку на параметр функции / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]