Class (или struct) саморекламу по шаблону

Является ли следующий законным?

template< typename T >
struct tree_node
   {
   T t;
   std::vector<tree_node> children;
   };

Комментарий к этому сообщению кажется, что это не так.


EDIT: Это не влияет на меня как тип сценария типа undefined. Предполагаемая семантика недвусмысленна. Если это недопустимое использование неполного типа, тогда это должна быть ошибка времени компиляции.

В моих тестах это кажется прекрасным (я использовал оба GCC и Clang - оба с -Wall -Werror -std=c++11).

Есть ли что-то в определении языка (до С++ 17), которое прямо или косвенно определяет это как поведение undefined, или оно просто недоопределено?


Имейте в виду, что это очень похоже, структурно, на что-то вроде следующего:

typedef int T;
struct tree_node;

struct tree_node
   {
   T t;
   tree_node * children;
   }

Ответ 1

Собственно, в результате N4371 мы имеем (из N4527, [vector.overview], будет в С++ 17):

Неполный тип T может использоваться при создании экземпляра вектора, если распределитель удовлетворяет полноте распределителя требования 17.6.3.5.1. T должен быть завершен до того, как какой-либо член полученной специализации вектор ссылается.

До этого vector невозможно было построить с неполным типом (который tree_node находится в этой точке), и это будет поведение undefined.