Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666

Binding reference to a temporary

21.03.2018, 17:10. Показов 2255. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
struct S {
    S()         { std::cout << __PRETTY_FUNCTION__ << '\n'; }
    S(const S&) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
    ~S()        { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
 
int main(int argc, char*[])
{
    S s{};
    std::cout << __LINE__ << '\n';
    const S& rs = argc > 1 ? s : static_cast<const S&>(S{});
    std::cout << __LINE__ << '\n';
}
Если argc > 1 не выполняется, то вывод такой:
Code
1
2
3
4
5
6
S::S()
12
S::S()
S::~S()
14
S::~S()
temporary object создаётся и уничтожается в том же выражении. Почему ссылка не продлевает его время жизни?
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2018, 17:10
Ответы с готовыми решениями:

GCC returning reference to temporary
Например вот так: int func2() { int input; cin &gt;&gt; input; return input; } int&amp;&amp; func1() {

Ошибка: Binding 'const Ship' to reference of type 'Ship&' discard qualifiers. Не пойму, где теряется const
есть public метод класса с квалификатором const тип _ships - QMultiMap QMultiMap имеет унаследованные методы values(),...

Передать внутри Binding в ConverterParameter ссылку на окно содержащее объект, который использует Binding
В главном окне в ресурсах есть Контекстные меню. У программы есть &quot;Ручной режим&quot;, если режим тру. то подставить одно контекстное меню....

22
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.03.2018, 09:27  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Undisputed Посмотреть сообщение
Вот та часть стандарта, которая описывает то, что такое temporary object для классовых типов:
Старая версия.
Сейчас `returning a prvalue` не должно приводить к созданию объекта. guaranteed copy elision типа.
Ну да ладно.


Цитата Сообщение от Undisputed Посмотреть сообщение
binding a reference to a prvalue так же нет
Есть
Цитата Сообщение от http://eel.is/c++draft/expr.static.cast#4
An expression e can be explicitly converted to a type T if there is an implicit conversion sequence from e to T, or if overload resolution for a direct-initialization of an object or reference of type T from e would find at least one viable function ([over.match.viable]).
If T is a reference type, the effect is the same as performing the declaration and initialization

T t(e);

for some invented temporary variable t ([dcl.init]) and then using the temporary variable as the result of the conversion.
Otherwise, the result object is direct-initialized from e.
[ Note: The conversion is ill-formed when attempting to convert an expression of class type to an inaccessible or ambiguous base class.
— end note
 ]
Цитата Сообщение от Undisputed Посмотреть сообщение
результат этого каста не подходит под определение "временный объект"
Но это выражение приводит к созданию временного объекта и ссылается на него.

Так или иначе, что с #13 делать?

Цитата Сообщение от Undisputed Посмотреть сообщение
Потому что берете ссылку на просроченный объект...
Как он успевает просрочиться до инициализации ссылки?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
23.03.2018, 10:56
Цитата Сообщение от rat0r Посмотреть сообщение
Старая версия.
А где взять новую? Это информация из драфта C++17
http://open-std.org/JTC1/SC22/... /n4567.pdf
Цитата Сообщение от rat0r Посмотреть сообщение
Сейчас `returning a prvalue` не должно приводить к созданию объекта. guaranteed copy elision типа.
Не очень понятно как это относится к текущему вопросу...
Цитата Сообщение от rat0r Посмотреть сообщение
Есть
Тоже не понятно, каким та цитата "перекрывает" обсуждаемые факты...
Цитата Сообщение от rat0r Посмотреть сообщение
Но это выражение приводит к созданию временного объекта и ссылается на него.
Понимаю что вы имеете ввиду, но думаю по определению стандарта этот самый объект не считается временным (если вы не согласны, отправьте плиз ссылку на стандарт, где сказано что результат lvalue выражения считается временным объектом).
Цитата Сообщение от rat0r Посмотреть сообщение
Так или иначе, что с #13 делать?
Можете уточнить? Просто плохо понимаю что вы подразумеваете под #13
Цитата Сообщение от rat0r Посмотреть сообщение
Как он успевает просрочиться до инициализации ссылки?
Так же как например тут:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct foo{int n = 100;};
 
const foo& getFoo()
{
    foo f;
    return f;
}
 
int main()
{
    const foo& f = getFoo();
    std::cout << f.n;
}
Думаю на самом деле не важно, объект будет просрочен до или после инициализации ссылки.
Важно то, что мы не можем использовать эту ссылку в связи с тем, что при обращении к этой ссылке в последующих вызовах будет доступ к протухшим данным...
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.03.2018, 14:03  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
А где взять новую?
На https://isocpp.org/ можно

Цитата Сообщение от Undisputed Посмотреть сообщение
Не очень понятно как это относится к текущему вопросу...
Ну так я написал "ну да ладно". Типа не важно.

Цитата Сообщение от Undisputed Посмотреть сообщение
по определению стандарта этот самый объект не считается временным
Так объект создан при "binding a reference to a prvalue". По определению стандарта это временный объект.

Цитата Сообщение от Undisputed Посмотреть сообщение
результат lvalue выражения считается временным объектом
Временный объект или нет это зависит от способа его создания.

Цитата Сообщение от Undisputed Посмотреть сообщение
Просто плохо понимаю что вы подразумеваете под #13
Binding reference to a temporary

Цитата Сообщение от Undisputed Посмотреть сообщение
Так же как например тут:
Так static_cast это не вызов функции.

Цитата Сообщение от Undisputed Посмотреть сообщение
Важно то, что мы не можем использовать эту ссылку в связи с тем, что при обращении к этой ссылке в последующих вызовах будет доступ к протухшим данным...
Я вроде не использовал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2018, 14:03
Помогаю со студенческими работами здесь

Ошибки underfined reference to parentClass::method и unerfined reference to vtable при линковке
При сборке компилятор выдает ошибки underfined reference to и unerfined reference to vtable. Есть базовый класс, два наследуемых от него и...

Temporary used for parameter
Добрый день. Есть код: //--------------------------------------------------------------------------- #include &lt;vcl.h&gt; ...

Not enough space on temporary disk
вот такую вещь мне пишет Аксесс 2000 когда запускаю запрос (MakeTable) сгруппировать строки с сервера SQL 8.0, где самая большая таблица...

Taking address of temporary
Я что - то с этим error: taking address of temporary совсем запутался. Это что, новая фитча С++14? Почему можно IplImage img =...

Не могу удалить файлы из папки Temporary Internet Files
Здравствуйте. На одном из компьютеров столкнулся с проблемой: не могу удалить файлы из папки Temporary Internet Files. Выделяю все файлы,...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru