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

Binding reference to a temporary

21.03.2018, 17:10. Показов 2517. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru