powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно ли возвращать ссылку на параметр функции
35 сообщений из 35, показаны все 2 страниц
Корректно ли возвращать ссылку на параметр функции
    #39543689
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навеяно предыдущим топиком. Корректно ли возвращать ссылку на **ссылочный** параметр функции?

Вот так:

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

int const &f = foo(3); 


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

Это всё выглядит как баг, но ни один компилятор на моей памяти не заорал варнингами.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #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
Корректно ли возвращать ссылку на параметр функции
    #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
Корректно ли возвращать ссылку на параметр функции
    #39543699
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav, компилятор нынче умный пошёл . у foo параметр ссылка. значит должна быть где то переменная (константа) в памяти на которую эта ссылка работает.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543702
вЪюкомпилятор нынче умный пошёл А его использующие?
Что, например, об этом можно сказать?
(Кстати, там и варнинг есть. Только кривоватый.)
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543707
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приплюснутый,

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

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


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

В каком месте этого кода ты нашёл временную переменную?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #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
Корректно ли возвращать ссылку на параметр функции
    #39543716
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПриплюснутыйвЪю, а что компилятор сделал не так?
программа должна возвращать 3 а не 0
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543717
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovpetravПо сути дела мы возвращаем ссылку на временную переменную.

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

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


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

там нет UB.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543722
вЪютам нет UB.Голословное утверждение.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #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
Корректно ли возвращать ссылку на параметр функции
    #39543727
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПриплюснутыйвЪютам нет UB.Голословное утверждение.
ты сам себе противоречишь.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543730
petravТолько что сработало в Студии 2015.Я писал про ситуацию из ОП-поста. При чём тут getStr?
petravЕсли честно, я не понял твоей цитаты на англ. Это не поможет?
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543731
вЪюПриплюснутыйпропущено...
Голословное утверждение.
ты сам себе противоречишь.Второе голословное утверждение.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #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
Корректно ли возвращать ссылку на параметр функции
    #39543734
petravВременная переменнаяЧто такое "временная переменная"? Я знаю про временные объекты.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543736
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПриплюснутыйpetravТолько что сработало в Студии 2015.Я писал про ситуацию из ОП-поста. При чём тут getStr?
petravЕсли честно, я не понял твоей цитаты на англ. Это не поможет?
Я понял. Спасибо.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543738
petravУдержание ссылки, так кажется это называется?Ладно, без цитат из стандарта (тем более, что та цитата не совсем выражает то, что нужно).

Упрощённо говоря, время жизни временного объекта продлевается до времени жизни ссылки, к которой он биндится.
Когда оканчивается время жизни параметров функции?
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543740
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПриплюснутыйpetravВременная переменнаяЧто такое "временная переменная"? Я знаю про временные объекты.
Объекты и есть переменные. Согласно постановлению Страуструпа С++ разрабатывался так что бы, по возможности, стереть разницу между... впрочем, мне кажется мы спорим о терминах. Путь будут объекты.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543744
petravОбъекты и есть переменные.
Мне из их описаний ( http://eel.is/c draft/intro.object#def:object , http://eel.is/c draft/basic#def:variable ) это не очевидно.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543746
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПриплюснутыйpetravУдержание ссылки, так кажется это называется?Ладно, без цитат из стандарта (тем более, что та цитата не совсем выражает то, что нужно).

Упрощённо говоря, время жизни временного объекта продлевается до времени жизни ссылки, к которой он биндится.
Когда оканчивается время жизни параметров функции?
Время их жизни заканчивается когда мы выходим из функции. Да я понял. Соответственно если мы вернём ссылку на временный объект порождённый для параметра функции, то со всеми отягчающими...

Осталось понять почему в моём последнем примере строка в корректном состоянии. Деструктор занулил указатель, длину строки и зарезервированный размер?
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543751
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravТут мы создаём на стеке временную переменную типа int со значением 3:

Не создаём мы её на стеке. Тут есть константа в сегменте кода, ссылка на которую и
передаётся в функцию. Без оптимизации GCC не выдаёт предупреждений и программа возвращает
3. С оптимизацией она возвращает 0 и компилятор честно предупреждение
Код: sql
1.
2.
3.
4.
aaa.cpp:11:24: warning: '<anonymous>' is used uninitialized in this function 
[-Wuninitialized]
    printf("f = %d\n", f);
                         ^


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543752
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приплюснутый,

Спасибо. Я всё понял. Я что-то затупил, ведь всё было очевидно. Но очевидно часто становится когда носом ткнут.

Непонятно только почему объект s пустой. Но это, наверное, неважно.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543753
petravВремя их жизни заканчивается когда мы выходим из функции.Ага. Так что с этой точки зрения та цитата из стандарта продлевает время жизни временного объекта до окончания вычисления полного выражения.
Впрочем, для ответа на вопрос о корректности использования переменной f эта цитата полезна сама по себе.

petravОсталось понять почему в моём последнем примере строка в корректном состоянии.Не знаю, что такое "корректное состояние" для подохших объектов.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543754
Dimitry SibiryakovpetravТут мы создаём на стеке временную переменную типа int со значением 3:

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

Да, ты прав.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543794
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petravПриплюснутыйпропущено...
Ладно, без цитат из стандарта (тем более, что та цитата не совсем выражает то, что нужно).

Упрощённо говоря, время жизни временного объекта продлевается до времени жизни ссылки, к которой он биндится.
Когда оканчивается время жизни параметров функции?
Время их жизни заканчивается когда мы выходим из функции. Да я понял. Соответственно если мы вернём ссылку на временный объект порождённый для параметра функции, то со всеми отягчающими...

Осталось понять почему в моём последнем примере строка в корректном состоянии. Деструктор занулил указатель, длину строки и зарезервированный размер?
в соответствии с С++ 15.2.6 + RVO
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543799
вЪюв соответствии с С++ 15.2.6 + RVOНикакого там (N)RVO нет и быть не может.
...
Рейтинг: 0 / 0
Корректно ли возвращать ссылку на параметр функции
    #39543811
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravПриплюснутыйпропущено...
Ладно, без цитат из стандарта (тем более, что та цитата не совсем выражает то, что нужно).

Упрощённо говоря, время жизни временного объекта продлевается до времени жизни ссылки, к которой он биндится.
Когда оканчивается время жизни параметров функции?
Время их жизни заканчивается когда мы выходим из функции. Да я понял. Соответственно если мы вернём ссылку на временный объект порождённый для параметра функции, то со всеми отягчающими...

Осталось понять почему в моём последнем примере строка в корректном состоянии. Деструктор занулил указатель, длину строки и зарезервированный размер?
Без оптимизации работает как бы ты хотел - 123.
Объект временный создан, удален. Но данные то на месте.

Оптимизация убирает _совсем_ временный объект, и нечего возвращать)

Просто строка с нулевыми всеми структурами интерпретируется как пустая.

Явное УБ. Не надо так делать.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно ли возвращать ссылку на параметр функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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