RAII-style single-linked list
Almost always auto. Only write down the specific type when you have to, it's shorter, clearer, and less error-prone.

You currently handle an empty list as a special case. Don't, it's neither efficient nor elegant.
Instead, use a pointer to pointer, and everything is simplified. As an example:

void push_back(const Type&amp; data) {
    auto p = &amp;head;
    while (*p)
        p = &amp;(*p)-&gt;next;
    *p = std::make_unique&lt;Node&lt;Type&gt;&gt;(data);
}


Good of you to avoid recursive descent in the dtor. But, you know that's not spelled destroy()?