13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
1

Запутался с lifetime return statement c++11

04.08.2021, 21:41. Показов 2058. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть в 11м стандарте такие строки:

The second context is when a reference is bound to a temporary. The temporary to which the reference is
bound or the temporary that is the complete object of a subobject to which the reference is bound persists
for the lifetime of the reference except:
....
The lifetime of a temporary bound to the returned value in a function return statement (6.6.3) is not
extended; the temporary is destroyed at the end of the full-expression in the return statement.
Из чего следует временный объект должен быть разрушен до возврата из функции, но при этом 11й стандарт явно разрешает
RVO:

Note: A copy or move operation associated
with a return statement may be elided or considered as an rvalue for the purpose of overload resolution in
selecting a constructor (12.8). — end note
Думаю никто не будет спорить, что константная ссылка продлит время жизни объекта класса A.
C++
1
2
3
4
5
6
A rvo_test()
{
    return A();
}
 
const A& ref = rvo_test()
Но при этом объект класса A должен быть разрушен. Без RVO - нет проблем так как будет копирование, а с RVO как это правило работает ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2021, 21:41
Ответы с готовыми решениями:

Else return statement
Почему если я пишу данный код, мне выдает ошибку: int factorialWithRecursion(int n, int result)...

Запутался с return
Подскажите как сделать возврат StringBuilder из цикла while() метода PriceGo ) Что-то застрял на...

Error:(42, 5) java: missing return statement
есть вот такая функция почему выдает ошибку? static boolean allDigitsUnique(int x) { ...

Что значит ошибка: missing return statement?
Что значит ошибка: missing return statement? import java.util.Scanner; public class Pirmin{...

26
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
04.08.2021, 22:01 2
И какое отношение первая цитата имеет к коду? (ну или наоборот, код к цитате)
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 22:14  [ТС] 3
Временный объект A привязывается к return statement или не так ?

Добавлено через 3 минуты
к return value

Добавлено через 2 минуты
У Саттера всё логично, но только я не вижу корреляции его слов со стандартом.
https://herbsutter.com/2008/01... ant-const/
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
04.08.2021, 22:18 4
Цитата Сообщение от squareroot Посмотреть сообщение
а с RVO как это правило работает ?
А на каком основании ты считаешь, что тут будет RVO?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 22:22  [ТС] 5
jugu, На том основании что конструктор копирования не вызывается.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
04.08.2021, 22:24 6
Первая цитата про код типа
C++
1
const A& f() { return A(); }
или
C++
1
2
struct S { const A& a; };
S f() { return { A() }; }
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 22:28  [ТС] 7
Для 11го стандарта будет или не будет определяется ключами компиляции.

Добавлено через 3 минуты
argcargv,
Первая цитата это вот эта:
The lifetime of a temporary bound to the returned value in a function return statement (6.6.3) is not
extended; the temporary is destroyed at the end of the full-expression in the return statement.
?
Тогда почему она только про это
C++
1
const A& f() { return A(); }
Но не про это:
C++
1
A f() { return A(); }
?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.08.2021, 22:30 8
Цитата Сообщение от squareroot Посмотреть сообщение
а с RVO как это правило работает ?
код вида:
C++
1
2
A rvo_test() { return A(); }
const A& ref = rvo_test()
соптимизиуется до состояния:
C++
1
const A& ref = A();
тобишь, что с RVO, что без него,
в обоих случаях ссылка продлит жизнь временного объекта.
RVO просто позволяет избежать копирований/перемещений.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
04.08.2021, 22:31 9
Цитата Сообщение от squareroot Посмотреть сообщение
jugu, На том основании что конструктор копирования не вызывается.
Ты описал суть RVO, а не основание. Ну да ладно, я посмотрел ассемблерный код - функция пустая, RVO есть. И правило работает, т.к. оптимизация не должна нарушать семантики языка.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 22:31  [ТС] 10
hoggy, Оптимизация это фишка компилятора, а не стандарта ISO. Пофиг до какого кода компилятор оптимизирует.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
04.08.2021, 22:33 11
squareroot, потому что в A f() { return A(); } ссылки, которые могут байндиться к временным объектам, это только ссылки в конструкторе копирования/перемещения A (если не применится RVO), но это другой случай:
A temporary bound to a reference parameter in a function call persists until the completion of the full-expression containing the call.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.08.2021, 22:33 12
Цитата Сообщение от squareroot Посмотреть сообщение
Оптимизация это фишка компилятора, а не стандарта ISO.
как ты думаешь,
почему стандартные оптимизации RVO/NRVO называют "стандартными" ?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 22:49  [ТС] 13
hoggy, Что Выспросили угадал ? Вы переводите дискуссию с правил из стандарта 11х плюсов в русло кто как чего там называет. Это не тот уровень дискуссии на который я расчитываю.

Добавлено через 10 минут
argcargv,
Не совсем понял какое отношение приведенная Вами цитата имеет к моему вопросу ?
Смысл приведенный Вами цитаты очевиден и бесспорен.
Но как она связана с остальным ? Там перечисление независмых друг от друга условий.

Добавлено через 1 минуту
hoggy, RVO стала частью стандарта с++17, но я спрашиваю про с++11
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
04.08.2021, 22:56 14
squareroot, первый параграф это про продление времени жизни временных объектов при байндинге ссылок и исключения из этого правила.
В A f() { return A(); } ссылки будут участвовать только если не будет применено RVO и будет использоваться конструктор перемещения или копирования.
В случае RVO тут вообще нет байндинга ссылок при вычислении операнда return. Так что весь параграф тут не при чём.

Добавлено через 2 минуты
Цитата Сообщение от squareroot Посмотреть сообщение
RVO стала частью стандарта с++17, но я спрашиваю про с++11
Т.н. RVO стала частью стандарта C++98.
"Guaranteed copy elision" это не "гарантированное RVO".
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
04.08.2021, 22:57 15
Цитата Сообщение от squareroot Посмотреть сообщение
Без RVO - нет проблем так как будет копирование, а с RVO как это правило работает ?
Какая разница, как этот временный объект получен, копированием, или другим конструктором?
Т.е. правило о привязке ссылки тут вообще не затрагивается, объект все равно будет (при привязке к ссылке в вашем коде), только с "RVO" мы его получим непосредственно, а без "RVO" с помощью копирования локального.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.08.2021, 22:59 16
Цитата Сообщение от squareroot Посмотреть сообщение
но я спрашиваю про с++11
нет.
ты спросил не про с++11, а про RVO:
Цитата Сообщение от squareroot Посмотреть сообщение
а с RVO как это правило работает ?
я тебе ответил как: с RVO код будет оптимизирован.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 23:04  [ТС] 17
argcargv, Вроде понял я Вашу логику. Т.е. поскольку параграф про ссылки, то в контексте return statement означает возврат по ссылки. Только ссылка какая то безымянная до присваивания const A& ref.

Добавлено через 54 секунды
hoggy, В названии темы специально указано что речь идет исключительно про с++11.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
04.08.2021, 23:05 18
Цитата Сообщение от squareroot Посмотреть сообщение
Только ссылка какая то безымянная до присваивания const A& ref.
Где "безымянная ссылка"? В A f() { return A(); }? В const A& ref = f();?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
04.08.2021, 23:11  [ТС] 19
Цитата Сообщение от argcargv Посмотреть сообщение
Где "безымянная ссылка"? В A f() { return A(); }? В const A& ref = f();?
Так нечестно. Вы приводите код с начало без
C++
1
const A& ref =
А потом с ним. И в зависимости от контекста получается с сылкой или без.
Надо определится. Мы рассматриваем все выражение или только субвыражение.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
04.08.2021, 23:12 20
Цитата Сообщение от squareroot Посмотреть сообщение
Мы рассматриваем все выражение или только субвыражение.
А что там выражение, что подвыражение?
0
04.08.2021, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2021, 23:12
Помогаю со студенческими работами здесь

Ошибка SQL statement doesn't return rows
form1.Users.SQL.Clear; form1.Users.SQL.Add('UPDATE `Users` SET Image =...

Missing return statement при использовании тернарного оператора вместо if
Компилятор пишет, что данная конструкция(метод) - Missing return statement Так нет public...

Выдает такую ошибку. [Error] return-statement with a value, in function returning
return-statement with a value, in function returning 'void' Делаю программу для вычисления...

Нюансы синтаксиса: как работают выражения вида statement = statement = statement?
Всем привет. Что значит такое выражение в c++? c = c2 = c/2; и как вообще работают такие...

Namespace declaration statement has to be the very first statement or after any declare call in the script
Добрый день форумчане. Пробую разобраться с ООП. Столкнулся с проблемой в казалось бы простой...

Lifetime контекста
Как у вас в крупных проектах на ASP.MVC живёт контекст базы данных? То есть пока всё просто и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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