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?


Ответы (0 шт):