Явное создание экземпляра шаблона и ссылки на пересылку

Недавно я обсуждал со студентами возможности ограничения типов для шаблонов, использующих ссылки для переадресации. Я знал о сравнении типов по is_same вместе с static_assert или enable_if, но мы также говорили о явном создании экземпляров шаблона.

Следующий пример работает для меня с GCC:

п.ч:

template <typename T>              
void f(T&& param); // declaration  

f.cpp:

#include <iostream>

template <typename T>
void f(T&& param) { std::cout << param << std::endl; }

// explicit instantiations:
template void f<int>(int&&);
template void f<int&>(int&);

main.cpp:

#include "f.h"      

int main() { 
   f(1);              
// f('1'); // LINKER ERROR   

   int i = 2;         
   f(i);              
}                     

Я не эксперт в явных экземплярах шаблонов, поэтому мне просто интересно, является ли такое решение переносимым/совместимым со стандартами. (Пожалуйста, не спрашивайте меня о вариантах использования, у меня их нет. Для меня это чисто академический вопрос.)

ОБНОВЛЕНИЕ

Меня также немного смущает формат явного создания экземпляров (<int>(int&&) и <int&>(int&)), но я предполагаю, что он задается выводом шаблона и, возможно, правилами свертывания ссылок.


person Daniel Langr    schedule 09.10.2017    source источник


Ответы (1)


Это нормально, и это переносимо/совместимо со стандартами.

Это называется специализацией шаблона, и вы можете прочитать больше на эту тему здесь

Специализация шаблона — это написание конкретного обработчика для конкретного вызова. В вашем коде у вас есть две специализации. Первый получает ссылку rvalue (например, целочисленный литерал, например 5) и возвращает int.

Второй получает ссылку lvalue (например, переменная b типа int имеет значение 5) и возвращает ссылку lvalue.

В случае по умолчанию вы пытаетесь напечатать параметр, используя std::stringstream.

person Petar Velev    schedule 09.10.2017