Ответ 1
Синтаксис Явное преобразование типа (функциональная нотация) здесь. Согласно грамматическому правилу он работает только с простым спецификатором типа или спецификатором typedef (т.е. С именем одного слова).
(акцент мой)
2) Функциональное выражение выражений состоит из простого спецификатора типа или спецификатора typedef (, другими словами, однотипное имя типа:
unsigned int(expression)
илиint*(expression)
недействительно), за которым следует одно выражение в круглых скобках. Это выраженное выражение точно эквивалентно соответствующему выражению в стиле C.
Вы можете изменить его на выражение выражения c-style или static_cast
или использовать его с помощью спецификатора typedef, как предположил @Jean-FrançoisFabre.
auto x1 = (unsigned int)(0);
auto x2 = static_cast<unsigned int>(0);
Цитаты из стандарта, $5.2.3/1 Явное преобразование типа (функциональная нотация) [expr.type.conv]
Простой тип-спецификатор ([dcl.type.simple]) или typename-specifier ([temp.res]), за которым следует произвольный список выражений в скобках или строковые элементы-инициализаторы значение указанного типа, заданное инициализатором.
И $7.1.7.2/1 Простые спецификаторы типа [dcl.type.simple]
Простыми спецификаторами типа являются
simple-type-specifier: nested-name-specifieropt type-name nested-name-specifier template simple-template-id nested-name-specifieropt template-name char char16_t char32_t wchar_t bool short int long signed unsigned float double void auto decltype-specifier type-name: class-name enum-name typedef-name simple-template-id decltype-specifier: decltype ( expression ) decltype ( auto )