Clang и G cc правы. unsigned int{};
рассматривается как явное преобразование типов во-первых, которое работает только с именем типа из одного слова; в то время как unsigned int
(и int*
et c) нет, но int
есть.
(выделено мной)
5) A одно слово имя типа , за которым следует braced-init-list - это значение указанного типа designating a temporary (until C++17)
whose result object is (since C++17)
direct-list-initialized с указанным скобками -init-list .
В качестве обходного пути вы можете
using unsigned_int = unsigned int;
unsigned_int{};
В результате он будет инициализировать значение (инициализировать нулем) временный unsigned int
как вы и ожидали.