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

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

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

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

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

20 ответов

13 просмотров

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта