Какая польза от замены не провал - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть класс Jav :: String, в котором я использую шаблоны.

 class String
 {
  String();
  String(std::size_t);

  template <class ITER_WRAP>
  String(const ITER_WRAP &iterator_begin_end);
 }

Я ожидаю, что когда я вызываю строку со целым числом со знаком, как MAX_PATH, она вызывает перегрузку std :: size_t aka unsigned int; так как я ожидаю, что замена не провал! По сути, int не имеет начальных, конечных элементов, поэтому подстановка должна завершиться неудачно, и эта функция не должна быть частью функций-кандидатов.

Однако, к моему ужасу, я получаю ошибку компиляции, const int не имеет начального или конечного элемента.

Когда замена является неудачей, а когда нет. Это работает только для типов.

1 Ответ

2 голосов
/ 11 апреля 2019

Ошибка замены не является ошибкой (SFINAE) касается только замены аргументов шаблона во время разрешения перегрузки. Все это в основном означает, что если подстановка выведенных аргументов шаблона в процессе выяснения, какая функция вызывать, приведет к созданию недопустимого типа или выражения, то это не приведет к ошибке компиляции, а просто приведет к соответствующему функция больше не рассматривается как потенциальный кандидат на вызов функции. Только материал, который появляется в объявлении шаблона функции (или частичной специализации класса или шаблона переменной), может быть объектом SFINAE. Потенциальная реализация определения шаблона функции происходит после того, как определено, какую функцию вызывать точно. Если подстановка аргумента шаблона приводит к недопустимой конструкции во время создания определения шаблона функции, такой сбой подстановки очень часто будет ошибкой.

В вашем конкретном случае, учитывая два варианта

String(std::size_t);

template <class ITER_WRAP>
String(const ITER_WRAP &iterator_begin_end);

вызов конструктора String с аргументом типа int выберет специализацию шаблона String<int>, поскольку для вызова String(std::size_t) требуется интегральное повышение, которое имеет худший рейтинг конверсии, чем точное совпадение, String<int> дает вам

...