Частичная специализация переменных шаблонов - PullRequest
0 голосов
/ 31 августа 2018

Я знаю, что могу частично специализировать шаблоны классов, и я знаю, что не могу частично указать шаблоны функций.

А как насчет шаблонов переменных ? Я не могу найти документацию о том, могут ли они быть частично специализированными.

1 Ответ

0 голосов
/ 05 сентября 2018

Да, согласно [temp.arg.template] / 2 :

Любые частичные специализации , связанные с шаблоном первичного класса или первичным шаблоном переменной , рассматриваются, когда создается специализация на основе параметра шаблона шаблона. ...

И [temp.expl.spec] / 7 :

... размещение объявлений частичной специализации шаблонов классов, шаблонов переменных , шаблонов классов-членов не шаблонных классов, шаблонов-членов статических данных не-шаблонных классов, шаблоны классов-членов, шаблоны классов и т. д. ...

Это также упоминается в [constraints.namespace.std] / 3 :

Поведение программы на C ++ не определено, если она объявляет явную или частичную специализацию любой стандартной библиотеки шаблон переменной , за исключением случаев, когда это явно разрешено спецификацией этого шаблона переменной.


Не говоря уже о том, что все основные компиляторы (Clang, GCC и MSVC) не имеют с ними проблем:

template <int x, int y>
constexpr int foo = -1;

template <>
constexpr float foo<1, 0> = 1.0;

template <int x>
constexpr double foo<1, x> = 1.1;

int main()
{
    static_assert(foo<0, 0> == -1, "");
    static_assert(foo<0, 1> == -1, "");
    static_assert(foo<1, 0> == 1.0, "");
    static_assert(foo<1, 1> == 1.1, "");
}

https://godbolt.org/z/R1c1zo

...