Можно ли использовать nullptr как тип? - PullRequest
0 голосов
/ 05 января 2019

Я узнал об использовании enable_if и наткнулся на следующий код.

template <class T,
         typename std::enable_if<std::is_integral<T>::value,
                                 T>::type* = nullptr>
void do_stuff(T& t) {
  std::cout << "do_stuff integral\n";
    // an implementation for integral types (int, char, unsigned, etc.)
}

Меня беспокоит то, что в параметре шаблона nullptr используется как параметр по умолчанию для std::enable_if<std::is_integral<T>::value, T>::type*, который также является типом.

Я не уверен, как мы можем назначить литерал для типа. Разве это не должно быть nullptr_t вместо этого?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

nullptr - это не тип, это значение (типа nullptr_t, которое можно преобразовать в любой тип указателя IIRC). В противном случае, любое стандартное использование nullptr, например:

int* a = nullptr;

не будет работать.

Это неназванный параметр шаблона по умолчанию, используемый для разрешения SFINAE в объявлении шаблона вместо использования возвращаемого типа. Это в основном как:

template<int=0>
void foo();

С трюком SFINAE / enable_if.

0 голосов
/ 05 января 2019

Этот шаблон принимает нетипизированный второй параметр, который является указателем typename std::enable_if<std::is_integral<T>::value, T>::type *, поэтому nullptr используется в качестве значения по умолчанию для этого указателя. Обратите внимание, что typename в этом втором параметре используется, чтобы компилятор выяснил, что ::type как тип, это не начало обычного параметра шаблона типа, такого как typename T

...