Информация об изменениях

Сообщение [msvc]: Интересная ошибка при портировании от 14.11.2020 23:40

Изменено 15.11.2020 0:02 rg45

[msvc]: Интересная ошибка при портировании
Привет всем!

При переносе кода с 2015 студии на 2019, получил интересное сообщение об ошибке — якобы повторное определение лямбды. После пошаговой минимизации кода получил такую вот выжимку:

http://coliru.stacked-crooked.com/a/6ae252b1d32a2985

template <typename...F>
void accept(F&&...) { }

template <typename...F>
auto make(F&&...f)
{
   return [=](auto&&...)
   {
      accept(f...);
      accept(f...); // error C2086: 'const main::<lambda_0d72bcd0d3210a40f73932d5a7eecd45> &<<f_0>>': redefinition
   };
}

int main()
{
   make([]{});
}


Как видно, ошибку провоцирует ПОВТОРНОЕ(!) обращение к функции accept. Проявляется только при использовании toolset 142, при 140 все норм. Переключение между C++14 и C++17 эффекта не дает. Семейство GCC ничего против не имеет.

Бага студии, как я понимаю?
[msvc]: Интересная ошибка при портировании
Привет всем!

При переносе кода с 2015 студии на 2019, получил интересное сообщение об ошибке — якобы повторное определение лямбды. После пошаговой минимизации кода получил такую вот выжимку:

http://coliru.stacked-crooked.com/a/6ae252b1d32a2985

template <typename...F>
void accept(F&&...) { }

template <typename...F>
auto make(F&&...f)
{
   return [=](auto&&...)
   {
      accept(f...);
      accept(f...); // error C2086: 'const main::<lambda_0d72bcd0d3210a40f73932d5a7eecd45> &<<f_0>>': redefinition
   };
}

int main()
{
   make([]{});
}


Как видно, ошибку провоцирует ПОВТОРНОЕ(!) обращение к функции accept. Проявляется только при использовании toolset 142, при 140 все норм. Переключение между C++14 и C++17 эффекта не дает. Семейство GCC ничего против не имеет.

Бага студии, как я понимаю?

[UPD]: Ошибка уходит при переключении на максимальную версию стандарта (/stdc++latest).