Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
1

Возвращение const ссылки на временный объект

12.10.2016, 22:51. Показов 6336. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер,
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
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
 
struct Point
{
    int _x;
    int _y;
};
 
struct Foo
{
public:
    Point _s;
    Point Get()
    {
        return _s;
    }
};
 
struct Bar
{
public:
    Foo* _foo;
    const Point& GetSpec()
    {
        if ( _foo )
            return _foo->Get();
        return Point{};
    }
};
 
int main()
{
    Foo a;
    Bar b;
    b._foo = &a;
 
    const auto& t = b.GetSpec();
    t._x;
}
Visual Studio 2015
warning C4172: returning address of local variable or temporary
разве const auto& не продлит жизнь временного? Или код с UB ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2016, 22:51
Ответы с готовыми решениями:

Возвращение ссылки на локальный объект
В каком-то коде мельком видел что-то вроде: char&amp; char_stub() { char c; return c; }; ...

Возвращение ссылки на локальный объект
int&amp; foo() { int a; //: warning C4172: возвращение адреса локальной или временной...

Временный объект
Требуется создать при помощи конструктора временный объект. Затем присвоить временный объект...

Возвращение ссылок с const
Объясните, пожалуйста, зачем делать возвращаемое значение из функции ссылкой с const, я понимаю, ...

30
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
13.10.2016, 07:51 21
Author24 — интернет-сервис помощи студентам
nd2, там ссылка static:
C++
1
2
3
4
5
const std::string &foo()
{
    static const std::string &ref = std::string("World");//static storage duration, она (ссылка) будет жить до самого конца.
    return ref;
}
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.10.2016, 07:54 22
Цитата Сообщение от Croessmah Посмотреть сообщение
там ссылка static
Где там static? Ты про что?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
13.10.2016, 08:01 23
Цитата Сообщение от nd2 Посмотреть сообщение
Ты про что?
а тЫ? Я про код TheCalligrapher.
Если тЫ про код с скриншота, то там тоже всё в порядке.
Ссылки идут в функцию, там создается объект,
не важно, будет там копирование или сразу в возвращаемое значение,
этот объект и возвращается из функции, а не ссылка на этот объект.
А уже дальше имеем продление жизни, подобно этому:
C++
1
const std::string &ref = std::string("этот временный объект нам вернула функция add");
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,076
13.10.2016, 08:02 24
Цитата Сообщение от nd2 Посмотреть сообщение
Т.е., эта цитата неверна (пример со string)?
Почему неверна? Верна. Но не имеет отношения к процитированному вами правилу.

Ситуация c greeting и add в этой цитате - эта ситуация с возвращением временного объекта из функции по значению. Никакой ссылки в этой цитате из add не возвращается. Ссылка возникает только снаружи функции.

Поэтому к правилу "Привязывание возвращаемой из функции константной ссылки к временному объекту вообще не продлевает время жизни временного объекта" эта цитата никакого отношения не имеет. Это правило ведет речь именно и только о возвращении ссылки из функции. Т.е. ссылка возникает внутри функции.
1
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.10.2016, 08:03 25
И в тексте там ничего про static нет.
Миниатюры
Возвращение const ссылки на временный объект  
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
13.10.2016, 08:06 26
Вы процитировали это:
Цитата Сообщение от nd2 Посмотреть сообщение
Привязывание возвращаемой из функции константной ссылки к временному объекту вообще не продлевает время жизни временного объекта.
это вот про это:
C++
1
2
3
4
const std::string &foo()//функция возвращает константную ссылку
{
   return std::string("oops...");//ни о каком продлении жизни речи не идет.
}
Добавлено через 2 минуты
Цитата Сообщение от nd2 Посмотреть сообщение
И в тексте там ничего про static нет.
Потому что надо уточнять про что пишите.
В теме с std::string есть только код пользователя TheCalligrapher,
Ваш код со скриншота не считается.
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,076
13.10.2016, 08:08 27
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы процитировали это:

Цитата Сообщение от TheCalligrapher
Привязывание возвращаемой из функции константной ссылки к временному объекту вообще не продлевает время жизни временного объекта.
это вот про это:
C++
1
2
3
4
const std::string &foo()//функция возвращает константную ссылку
{
   return std::string("oops...");//ни о каком продлении жизни речи не идет.
}
Да, совершенно верно.

В отрывке же из книги, приведенном nd2, ситуация совсем другая.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.10.2016, 08:09 28
Цитата Сообщение от Croessmah Посмотреть сообщение
Если тЫ про код с скриншота
Естественно. Мы не поняли друг друга.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но не имеет отношения к процитированному вами правилу.
Понял.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
13.10.2016, 08:16 29
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В отрывке же из книги, приведенном nd2, ситуация совсем другая.
Угу, но
Цитата Сообщение от nd2 Посмотреть сообщение
Мы не поняли друг друга.
Я вообще сначала хотел Вас раскритиковать в теме,
но потом перечитал, вроде как всё правильно,
при первом прочтении что-то не так понял.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2016, 11:33 30
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вам не нравится auto в коде? Или смысл вашего вопроса? Или почему в1 посте выделено const auto& ? Не пойму смысл вашего вопроса)
Касался вопроса:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разве const auto& не продлит жизнь временного?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И в чём заключается стиль?
В префиксе "_" для мемборов и именовании методов с большой.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.10.2016, 14:23 31
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в выражениях использованные в file scope
понял вашу точку зрения.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во многих случаях это так ("базовое" правило). Но в общем случае - нет. Именно поэтому "базовое" правило продления времени жизни временного объекта имеет такое количество исключений. Почти каждое из этих исключений - это именно те контексты, в которых время жизни временного объекта не совпадает с временем жизни обычного именованного объекта, объявленного в тот же месте.
спасибо
0
13.10.2016, 14:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2016, 14:23
Помогаю со студенческими работами здесь

Ссылка на временный объект
Наткнулся тут в гугле на одну интересную тему. Как известно, данный код не соответствует...

Временный объект и конструктор копирования
Добрый день! Столкнулся c задачкой в тесте: class A{ public: A(){ ...

Не создаётся ссылка на временный объект
Что же делать? Код: #include &lt;iostream&gt; using namespace std; class BigClass { public:

Возвращение ссылки из функции
Привет, я немного не понимаю, почему в следующем коде в строках 16-17 надо возвращать именно...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru