170 похожих чатов

У меня есть функция, которая возвращает std::future. Данный тип не

имеет конструктора копирования. Как мне правильно вернуть из функции std::future?

Пример:
std::future foo()
{
return promise.get_future();
}

По идеи данный пример компилируется, так как у нас RVO и конструктор копирования вызваться не будет. Но насколько я помню, то только начиная с с++17 гарантируется, что в данном случае будет RVO. А до с++17 я должен по идеи делать std::move ? Чтобы код был переносимым.

20 ответов

5 просмотров

Если написать std::move, то RVO работать не будет. Про гарантию RVO - сейчас уточню, когда она появилась...

Александр-Кузнецов Автор вопроса
Пашечка
Если написать std::move, то RVO работать не будет....

Да, если мы будем делать move, то оптимизации не будет. Сама оптимизация RVO появилась давно, но вот вроде гарантировать ее в данном случае стал c++17. До с++17 это вроде как на усмотрение компилятора.

Александр Кузнецов
Да, если мы будем делать move, то оптимизации не б...

Да не, вроде как с 11 стандарта гарантируется в твоем случае: In a return statement, when the operand is the name of a non-volatile object with automatic storage duration, which isn't a function parameter or a catch clause parameter, and which is of the same class type (ignoring cv-qualification) as the function return type. This variant of copy elision is known as NRVO, "named return value optimization". In the initialization of an object, when the source object is a nameless temporary and is of the same class type (ignoring cv-qualification) as the target object. When the nameless temporary is the operand of a return statement, this variant of copy elision is known as RVO, "return value optimization".

Эй, я и так это сделал!

Александр Кузнецов
Да, если мы будем делать move, то оптимизации не б...

Вот тут написано: https://en.cppreference.com/w/cpp/language/copy_elision

если я ничего не путаю, в вашем текущем коде выберется удаленный конструктор копирования и ничего не скомпилируется stmt.return#2.sentence-4 the return statement initializes the returned reference or prvalue result object of the (explicit or implicit) function call by copy-initialization from the operand. dcl.init#general-16.6.2.1 If overload resolution is successful, the selected constructor is called to initialize the object, with the initializer expression or expression-list as its argument(s).

Vlad
если я ничего не путаю, в вашем текущем коде выбер...

нужен std::move, чтобы операнд стал prvalue и конструктор перемещения выиграл у конструктора копирования

Vlad
нужен std::move, чтобы операнд стал prvalue и конс...

Там же написано: A copy operation associated with a return statement can be elided or converted to a move operation if an automatic storage duration variable is returned

В жопу иди

Пашечка
Там же написано: A copy operation associated wit...

Automatic storage duration - обычная локальная переменная как раз под это попадает

а вам с каким стандартом нужно быть совместимым?

Vlad
>can be elided и как это помогает?

Агрх, бесит! Это же, фактически, UB. Тут can be, там can be, а что в итоге - никто предсказать не может

Пашечка
Агрх, бесит! Это же, фактически, UB. Тут can be, т...

где вы UB увидели? в этом случае все диагностируемо на этапе компиляции (ill-formed)

Vlad
где вы UB увидели? в этом случае все диагностируем...

Окей, undefined тут не подходит. Но всё равно выглядит крайне не приятно

promise.get_future() это prvalue выражения типа std::future, соответственно при инициализации результата функции конструктор перемещения выигрывает у конструктора копирования. делать ничего не нужно, все будет работать ссылки на 11 стандарт: https://timsong-cpp.github.io/cppwp/n3337/expr.call#10 https://timsong-cpp.github.io/cppwp/n3337/dcl.init#14 https://timsong-cpp.github.io/cppwp/n3337/dcl.init#16.6.1 механика copy elision не имеет никакого значения в таком вопросе о корректности программы

Vlad
promise.get_future() это prvalue выражения типа st...

Ты лучший! @alex_monster15, мы кажется разобрались)

Vlad
promise.get_future() это prvalue выражения типа st...

компиляторы согласны https://godbolt.org/z/oYGrG9M16

Александр-Кузнецов Автор вопроса

Похожие вопросы

Обсуждают сегодня

@Aiwan что такое база образца?
Alexey
27
Не многие знают, а кто знает, тот уже успел забыть, что в далёком 2004 году эта игра произвела настоящий фурор, настолько революционной была технология, применяемая для её соз...
ICCID
4
Хотя у меня сейчас есть более сложная задача, вот её думаю: как объяснить челу переходного возраста противоположного полу, обучающегося в польском колледже (а-ля наш техникум)...
Вячеслав Кузьменко
15
коллеги, добрый вечер! А никто не знает как модальная форма может себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult...
Михаил
83
Добрый день Хочу начать обучение языку, не являюсь представителем it, буду благодарна за помощь, совсем пока не понимаю ничего) Подскажите, пожалуйста, где можно начать первы...
Sara Lala
30
верно что я могу удалить эти addq и subq т.к. со стеком никакого взаимодействия нет (исключая call)?
Michael
16
Hi Everyone! To all Are you Looking for Interview Support at the Lowest Price? Look no further! Then contact us We offer Interview Support for a low cost variety of technol...
Rambabu Nallamilli
3
средствами IBX как-то можно выполнить запрос insert ... returning?
Igor
31
всем привет. подскажите: вот по русски называется "прошивка для контроллера". или "бинарь" могут сказать. или "дамп". А как по английски это называется? Я хочу попытаться по...
Павлик Ливаткин
4
А если изначально бот работал так : есть сайт онлайн школы. У каждого ученика свой кабинет. Где он авторизуется по своим данным. И уже в кабинете, на самом сайте делает оплату...
Денис 💡 Фрилансер
13
Карта сайта