Почему мой фрагмент кода ссылается? Что на самом деле здесь происходит?
Ну, нет ничего на ссылку. Для того, чтобы рассмотреть эффекты явной реализации. От n3337:
[temp.explicit] (выделено мной)
10 За исключением встроенных функций и шаблона класса
специализации , явные объявления экземпляров имеют эффект
подавления неявной реализации объекта, которому они
см. [Примечание: цель состоит в том, чтобы встроенная функция, которая является
предмет явного объявления экземпляра все еще будет
неявно создается при использовании odr ([basic.def.odr]), так что
тело может быть рассмотрено для встраивания, но это не вне строки
встроенная функция будет сгенерирована в модуле перевода. - конец
примечание]
Таким образом, неявная реализация специализации шаблона класса X<int>
не подавляется. Это также агрегат, поэтому его инициализация происходит встроенным образом, и нам не с чем связываться. Однако, если бы у него были какие-либо члены, эти были бы исключены в соответствии с пунктом 8 :
Явный экземпляр, который называет специализацию шаблона класса
также явный экземпляр того же вида (объявление или
определение) каждого из его членов (не включая членов, унаследованных
из базовых классов), который ранее не был
в блоке перевода, содержащем явную реализацию, кроме
как описано ниже.
Так что если у вас вместо совокупности было что-то похожее на это:
template <typename>
struct X {
X();
};
template <typename T>
X<T>::X() {}
extern template struct X<int>;
int main()
{
X<int>{};
}
Это не сработает, как вы ожидаете, поскольку в ODR используется конструктор, определение которого никогда не создается. Объявление является созданным экземпляром, потому что конкретизированная специализация создается, как упомянуто выше. Но мы никогда не получим никакого определения под подавляющим эффектом явного объявления экземпляра.