Может ли std :: initializer_list быть специализированным? - PullRequest
1 голос
/ 25 мая 2020

Просматривая различные правила инициализации списка, я нашел это в dcl.init.list # 3.6 :

В противном случае, если T является специализацией std​::​initializer_­list<E>, объект построен, как описано ниже.

С другой стороны, в синопсисе std::initializer_list, в support.initlist , я обнаружил следующее утверждение:

Если объявлена ​​явная специализация или частичная специализация initializer_­list, программа сформирована неправильно.

Эти кажутся противоречивыми заявления, так что я неправильно понял?

Ответы [ 2 ]

4 голосов
/ 25 мая 2020

«Специализация шаблона» имеет два различных значения:

  1. «Явная (полная) специализация» или «частичная специализация» - языковая конструкция, которая изменяет значение шаблона для некоторых комбинация параметров шаблона.

  2. Что-то, что было создано из шаблона путем подстановки в него аргументов шаблона.
    Другими словами, если вы указываете аргументы шаблона для шаблона, результирующий тип / function / variable / ... - это специализация этого шаблона. Например, std::vector<int> - это специализация из std::vector.

Похоже, что в первом цитируемом отрывке используется (2).

Итак «если T является специализацией std​::​initializer_­list<E>» примерно означает «если существует такой E, что std::is_same_v<T, std::initializer_list<E>>», или «если T - это a std::initializer_list<E> ".

1 голос
/ 25 мая 2020

Нет противоречия.

Если объявлена ​​явная специализация или частичная специализация initializer_list, программа сформирована неправильно.

Означает, что вы не можете объявить специализацию. Сам компилятор может исключать специализации std​::​initializer_­list


Проблема, которая может вызывать у вас проблему, заключается в том, что конкретный тип, который вы получаете из шаблона, называется специализацией. Об этом и говорится в первом абзаце. Во втором абзаце говорится о фактическом определении / объявлении специализации для std::initializer_list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...