TIL следующая программа является законной и ничего:
#include <vector>
struct Bar;
struct Foo
{
using BarVec = std::vector<Bar>::size_type;
};
struct Bar {};
int main()
{
Foo f;
}
Как? Bar
является неполным, поэтому компилятор не знает, что такое std::vector<Bar>
или он содержит член size_type
или что элемент size_type
является типом.
Единственное объяснение, которое я могу придумать, заключается в том, что любая гипотетическая специализация (предположительно) должна быть уже в пределах возможностей, чтобы заставить size_type
использовать значение, отличное от значения, указанного в определении базового шаблона, и size_type
не является зависимым именем (оба фактора, способствующие определенности компилятора).
Какое юридическое обоснование здесь?