Во-первых, то, что я делаю, похоже работает на всех GCC/Clang/MSVC/icc/etc, поэтому мой вопрос: это случайно или стандарт требует, чтобы это было разрешено?
С одной стороны это кажется логическим продолжением вещей, но с другой стороны синтаксис выглядит настолько странно, что я обеспокоен тем, что ухожу на территорию зависимости от ошибок:
#include
template
void Bar();
template
struct A {
struct T : std::true_type {};
static void Foo() { Bar(); }
};
// The normal way to do thing:
template struct A::T : std::false_type {};
// But this also seems to work despite looking very odd:
using A3 = A;
template struct A3::T : std::false_type {};
void Go() {
A::Foo(); // Calls Bar()
A::Foo(); // Calls Bar()
A::Foo(); // Calls Bar()
A::Foo(); // Calls Bar()
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... upposed-to