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

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

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

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

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

20 ответов

8 просмотров

Если написать 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

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
32
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
1
Hey there Which is the best Linux destro for developers (coding)? To my research on reddit, they said Linux mint is good for mid level spec and Ubuntu for high Lev hardwar...
Wiz 🪄
11
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
Всем привет! У меня почему-то по-разному отображается TListView в Debug и Release режимах (FireMonkey)! При запуске под Win приложения TListView заливается программо. в Debug ...
Александр COM
8
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
Карта сайта