Он не будет компилироваться, когда вы попытаетесь создать foo
? Вы изменяете значение foo
, как только это переменная, и как только это тип.
#include <iostream>
using namespace std;
template <typename T>
struct Foo {
static_assert(std::is_same<T, wchar_t>::value, "Failure");
};
using FooINT = Foo<int>;
int main() {
FooINT foo; // breaks
return 0;
}
Таким образом, вы в основном определяете псевдоним типа, который бесполезен. К сожалению, создание определенного псевдонима не приводит к немедленной реализации типа.
Чтобы разработать немного больше. using
просто вводит псевдоним, это не «производят» типа, так что возможно следующее:
#include <iostream>
using namespace std;
template <typename T>
struct Foo {
static_assert(std::is_same<T, wchar_t>::value, "Failure");
};
using FooINT = Foo<int>; // should it break now or not?
template <>
struct Foo<int> {
int A_OK;
};
int main() {
FooINT foo; // works now
return 0;
}
Таким образом, вы не можете сделать using FooINT = Foo<int>;
не компилировать сам по себе. Вам понадобится какой-то механизм для фактического создания шаблона.
Просто экземпляр Foo (тип псевдоним), это то же самое. По мере того, как вы не создаете экземпляр, компилятор не «производит» код, а утверждение не проверяется. – MagunRa