При переносе кода с 2015 студии на 2019, получил интересное сообщение об ошибке — якобы повторное определение лямбды. После пошаговой минимизации кода получил такую вот выжимку:
Как видно, ошибку провоцирует ПОВТОРНОЕ(!) обращение к функции accept. Проявляется только при использовании toolset 142, при 140 все норм. Переключение между C++14 и C++17 эффекта не дает. Семейство GCC ничего против не имеет.
Бага студии, как я понимаю?
[UPD]: Ошибка уходит при переключении на максимальную версию стандарта (/stdc++latest).
[UPD2]: Зарепортил им багу.
--
Не можешь достичь желаемого — пожелай достигнутого.
Привет.
R>При переносе кода с 2015 студии на 2019, получил интересное сообщение об ошибке — якобы повторное определение лямбды. После пошаговой минимизации кода получил такую вот выжимку:
Да, ошибка, попадались не раз.
Какой версией собираете ?
Тут вышла 16.8 там починили несколько похожих ошибок и добавили новых
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>Какой версией собираете ? _NN>>Тут вышла 16.8 там починили несколько похожих ошибок и добавили новых
R>У меня сейчас 16.8.1. Позавчера обновлялся.
Тогда этот пример собирается без проблем:
cl a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
a.cpp
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
Кучу багов по лямбдам закрывают, рекомендуя использовать new lamdba processor
Это ключ /Zc:lamdba. Компиляция с /std:c++latest его включает автоматически,
На 16.8.1 (14.28.29333) собирается. Не собирается с /std:c++latest /Zc:lambda-
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>Тогда этот пример собирается без проблем:
R>Посмотри, пожалуйста, какие у тебя стоят опции Platform Toolset и C++ Language Standard?
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.8.1
** Copyright (c) 2020 Microsoft Corporation
**********************************************************************
C:\Users\A\AppData\Local\Temp>cl a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
a.cpp
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
Здравствуйте, _NN_, Вы писали:
_NN>msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28) _NN>msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)
Build tools вижу, а используемый стандарт языка не вижу. Там есть еще такие опции /stdc++14, /stdc++17 и /stdc++latest. По-видимому, у тебя автоматом подхватывается /stdc++latest. У меня на latest тоже компилится, а на 14 и 17 падает.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28) _NN>>msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)
R>Build tools вижу, а используемый стандарт языка не вижу. Там есть еще такие опции /stdc++14, /stdc++17 и /stdc++latest. По-видимому, у тебя автоматом подхватывается /stdc++latest. У меня на latest тоже компилится, а на 14 и 17 падает.
По умолчанию вроде это 14 и на 14 как раз не падает :D
cl /std:c++14 a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
a.cpp
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:a.exe
a.obj
cl /std:c++17 a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
a.cpp
a.cpp(6): error C2086: 'const main::<lambda_f84292834d425aed7f29e65d92bb41fd> &<<f_0>>': redefinition
a.cpp(6): note: see declaration of '<<f_0>>'
a.cpp(16): note: see reference to function template instantiation 'auto make<main::<lambda_f84292834d425aed7f29e65d92bb41fd>>(main::<lambda_f84292834d425aed7f29e65d92bb41fd> &&)' being compiled
a.cpp(6): error C2086: 'main::<lambda_f84292834d425aed7f29e65d92bb41fd> make::<lambda_df24c58a678bb2227fd803635c6fabc4>::<f_0>': redefinition
a.cpp(6): note: see declaration of 'make::<lambda_df24c58a678bb2227fd803635c6fabc4>::<f_0>'
a.cpp(6): error C2437: '<f_0>': has already been initialized
a.cpp(6): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'make::<lambda_df24c58a678bb2227fd803635c6fabc4>'
a.cpp(6): note: No constructor could take the source type, or constructor overload resolution was ambiguous
Мы у себя вообще собираем всё на c++latest.
Багов всё равно полно что в c++14 что в c++17 так тут хоть код писать удобней писать и более оптимальный получается.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28) _NN>>msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)
R>Build tools вижу, а используемый стандарт языка не вижу. Там есть еще такие опции /stdc++14, /stdc++17 и /stdc++latest. По-видимому, у тебя автоматом подхватывается /stdc++latest. У меня на latest тоже компилится, а на 14 и 17 падает.
Коллега тут подсказал про /experimental:newLambdaProcessor и действительно с этим флагом собирается.