Следующий фрагмент скомпилирован отлично с помощью gcc, icc и msvc (последний вопрос), но приключения совершаются с помощью <source>:6:9: error: calling a private constructor of class 'B<int>'
в отмеченной строке. Тем не менее он отлично работает для бесплатной функции шаблона, как показано в коде:
struct A {
template<class T>
static void create () {
T();
}
};
template<class T>
void create() {
T();
}
template<typename T>
struct B {
friend void A::create<B>();
friend void create<B>();
private:
B() = default;
};
int main() {
A::create<B<int>>(); // clang trips here
create<B<int>>(); // fine!
}
Какая может быть разница между статическим членом шаблона класса без шаблона и свободной функцией шаблона в этом контексте?