C++17 Разрешено константное вычисление для всех аргументов шаблона, не являющихся типом
Изучаю C++17 Разрешено константное вычисление для всех аргументов шаблона, не являющихся типом этот пункт есть в таблице:
https://ru.cppreference.com/w/cpp/compiler_support/17
Пробовал пример с double не работает в VS2005 и VS2019 (ниже)
#include <iostream>
template<double Value>
constexpr double getFactorial()
{
return Value * getFactorial<Value - 1.0>();
}
template<>
constexpr double getFactorial<0.0>() { return 1.0; }
int main()
{
std::cout << getFactorial<4.0>() << '\n';
}
Пробовал этот пример (ниже) работает в VS2005 и одинаково работает в VS2019 только если закоментировать две первые строчки main:
#include <iostream>
template<int* p> class X { };
int a[10];
struct S { int m; static int s; } s;
int main()
{
//X<&a[2]> x3; // error: address of array element
//X<&s.m> x4; // error: address of non-static member
X<&s.s> x5; // error: &S::s must be used OK: address of static member
X<&S::s> x6; // OK: address of static member
}
Так в чем же смысл этого изменения С++17 если на VS2005 те же ошибки что и на VS2019?