классов под MSVC?
Сразу проблему описывай
Access Violation. Не инициализированные переменные вместо содержимого разбинженной структуры.
Можно пример кода, версию MSVC и подтверждение, что сама структура в порядке?
Это мув конструктор срет имхо
uninitialized != moved-out
Да, согласен
Настоящий пример кода с проблемой есть только в моем проекте. Если буду тратить много времени на получение минимально воспроизводимого фрагмента, то могу сразу в 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) и т.д.)
Отладчик показывает или ниже действительно оказываются проблемы?
а для чего тут мув?
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.
чтобы не делать копирование?)
Какое копирование? Там особая категоря значения для structure binding
то есть копирования по вашему в коде без мув не будет?
пардон, ТС'у нужно: auto&& [a,b,c] = ret; Всегда так юзаю, не обратил внимания, что у него нет двойного амперсанда
Отладчик показывает. Отлаживаю какой-то не понятный баг с AccessViolation. И вызов деструкторов над невалидными объектами очень подходит под описание. Причем, краш происходит только в релизной сборке (выключена оптимизация и добавление pdb и для дебага и для релиза). Стектрейс (если нужно) самого краша (boost.)asio: https://pastebin.com/NVUCdtWv
Для наглядности. Раньше его не было. Но когда увидел, что отладчик показывает невалидные значения переменных добавил временную переменную.
ну я не исключаю, что мсвц неправильно скомпилировал, но мув здесь лишний, auto& [a, b, c] = ret; это просто синтаксический сахар и не более ,никаких копирований и даже созданий ссылок
мув делает больше работы, чем эквивалетное создание через ссылку(noop)
разве мув что-то делает? (кроме того как "метит" значение)
лучше явно написать одиночный амперсанд, потому что это lvalue
делает, создаётся новое значение и мувается из ret в новое значение, а a, b, c становятся алиасами на поля в новом значении
а это к чему? утверждение вроде было, что там будет копирование
на уровне языка сахар, на уровне асма никто не гарантирует, что никаких ссылок не будет
на уровне асм никто ничего не гарантирует, там может бытть просто бесконечное xor eax eax
мне не понятно, зачем делать какие-то утверждения про то будут там ссылки, или нет, если это не определено
потому что с точки зрения языка это не ссылки, а structured binding'и
Нифига себе, это ж телепатия, 120ый уровень!
Это хорошая идея!
чё, не перевелись ещё телепаты в чате?
Обсуждают сегодня