Explicity, специализирующийся на шаблоне класса в исходном файле

#c #templates #template-specialization #template-instantiation

#c #шаблоны #шаблон-специализация #шаблон-создание экземпляра

Вопрос:

У меня есть шаблон класса с некоторыми псевдонимами шаблонов. Поскольку я использую только закрытый набор типов в шаблоне, я хотел бы специализироваться и явно создавать их экземпляры. В настоящее время у меня есть это:

 // Header
template <typename T>
struct Literal {
    Literal(std::string_view);
};

using StringLiteral = Literal<std::string>;

// Source:
StringLiteral::Literal(std::string_view){/*...*/}
  

Я предполагал, что мне понадобится extern template StringLiteral или что-то в этом роде, но это, кажется, работает. Я могу использовать StringLiteral в совершенно другом TU, отличном от того, в котором находится специализация.

Мой вопрос в том, законно ли это? И если да, то почему не требуется явное создание экземпляра? Мы не смогли неявно создать экземпляр шаблона в другом TU, поскольку у нас нет определения для конструктора.

Кроме того, использование псевдонима шаблона для специализации кажется мне странным, правильно ли это?

Комментарии:

1. Кажется, я помню, что компоновщик видит несколько реализаций класса template, предполагает, что все они одинаковы, выбирает одну и отбрасывает остальные, если вам повезет, он выберет правильную