Ошибка шаблонных переменных с лямбдами в Visual Studio?

C++14 предоставляет переменные шаблоны, которые прекрасно работают в /questions/tagged/visual-studio-2017, но в лямбдах они, кажется, распадаются. Например:

template <typename T>
const auto PI = std::acos(static_cast<T>(-1));

int main() {
  auto func = []() { cout << PI<float> << endl; };

  func();
}

На gcc 6.3 это выводит:

3,14159

На Visual Studio 2017 это выводит:

0.0

1 ответ

Решение

Странная ошибка, но, похоже, есть надежный обходной путь, который подходит как для данного случая, так и для соответствующего случая. В обоих случаях принудительная активация шаблона, кажется, делает работу в VS2017:

template <typename T>
const auto PI = std::acos(static_cast<T>(-1));

int main() 
{
  PI<float>; // <------ this
  auto func = []() { std::cout << PI<float> << std::endl; };

  func();
}

GCC 6.3, например: https://ideone.com/9UdwBT

Другие вопросы по тегам