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.