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

Привет всем. Кто-то сталкивался с проблемами с structured bindings для

классов под MSVC?

31 ответов

30 просмотров

Сразу проблему описывай

LaG1924- Автор вопроса
Alexander Karaev
Сразу проблему описывай

Access Violation. Не инициализированные переменные вместо содержимого разбинженной структуры.

LaG1924
Access Violation. Не инициализированные переменные...

Можно пример кода, версию MSVC и подтверждение, что сама структура в порядке?

LaG1924- Автор вопроса
Dmitriy [Отпуск]
Можно пример кода, версию MSVC и подтверждение, чт...

Настоящий пример кода с проблемой есть только в моем проекте. Если буду тратить много времени на получение минимально воспроизводимого фрагмента, то могу сразу в MS багрепорт отправить. Наглядный пример проблемы: // объявление функции и возвращаемого значения struct FooResult {int a; std::string b; bool c;}; asio::awaitable<FooResult> Foo(int x, std::string y); //в коде где используется функция auto ret = co_await Foo(x, y); auto [a,b,c] = std::move(ret); Здесь сразу после выполнения Foo, в ret находятся валидные данные, однако после выполнения строчки с биндингом, в ret оказываются moved-out данные (что логично и нормально), а переменные a b и c содержат мусор (отладчик студии показывает std::string как <NULL>, bool как true(230) и т.д.)

LaG1924
Настоящий пример кода с проблемой есть только в мо...

Отладчик показывает или ниже действительно оказываются проблемы?

LaG1924
Настоящий пример кода с проблемой есть только в мо...

https://en.cppreference.com/w/cpp/language/structured_binding > Like a reference, a structured binding is an alias to an existing object. Unlike a reference, a structured binding does not have to be of a reference type.

Aleksander Spichak
а для чего тут мув?

чтобы не делать копирование?)

Denis P
чтобы не делать копирование?)

Какое копирование? Там особая категоря значения для structure binding

Aleksander Spichak
Какое копирование? Там особая категоря значения дл...

то есть копирования по вашему в коде без мув не будет?

пардон, ТС'у нужно: auto&& [a,b,c] = ret; Всегда так юзаю, не обратил внимания, что у него нет двойного амперсанда

LaG1924- Автор вопроса
Dmitriy [Отпуск]
Отладчик показывает или ниже действительно оказыва...

Отладчик показывает. Отлаживаю какой-то не понятный баг с AccessViolation. И вызов деструкторов над невалидными объектами очень подходит под описание. Причем, краш происходит только в релизной сборке (выключена оптимизация и добавление pdb и для дебага и для релиза). Стектрейс (если нужно) самого краша (boost.)asio: https://pastebin.com/NVUCdtWv

LaG1924- Автор вопроса
Aleksander Spichak
а для чего тут мув?

Для наглядности. Раньше его не было. Но когда увидел, что отладчик показывает невалидные значения переменных добавил временную переменную.

LaG1924
Настоящий пример кода с проблемой есть только в мо...

ну я не исключаю, что мсвц неправильно скомпилировал, но мув здесь лишний, auto& [a, b, c] = ret; это просто синтаксический сахар и не более ,никаких копирований и даже созданий ссылок

Denis P
то есть копирования по вашему в коде без мув не бу...

мув делает больше работы, чем эквивалетное создание через ссылку(noop)

Kelbon
мув делает больше работы, чем эквивалетное создани...

разве мув что-то делает? (кроме того как "метит" значение)

Aleksander Spichak
пардон, ТС'у нужно: auto&& [a,b,c] = ret; Всегда ...

лучше явно написать одиночный амперсанд, потому что это lvalue

Aleksander Spichak
разве мув что-то делает? (кроме того как "метит" з...

делает, создаётся новое значение и мувается из ret в новое значение, а a, b, c становятся алиасами на поля в новом значении

Kelbon
мув делает больше работы, чем эквивалетное создани...

а это к чему? утверждение вроде было, что там будет копирование

Kelbon
ну я не исключаю, что мсвц неправильно скомпилиров...

на уровне языка сахар, на уровне асма никто не гарантирует, что никаких ссылок не будет

Denis P
на уровне языка сахар, на уровне асма никто не гар...

на уровне асм никто ничего не гарантирует, там может бытть просто бесконечное xor eax eax

Kelbon
на уровне асм никто ничего не гарантирует, там мож...

мне не понятно, зачем делать какие-то утверждения про то будут там ссылки, или нет, если это не определено

Denis P
мне не понятно, зачем делать какие-то утверждения ...

потому что с точки зрения языка это не ссылки, а structured binding'и

Rustam
Это мув конструктор срет имхо

Нифига себе, это ж телепатия, 120ый уровень!

Ilya Zviagin
Нифига себе, это ж телепатия, 120ый уровень!

чё, не перевелись ещё телепаты в чате?

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта