Ответ 1
[C++11: 5.2.3/1]:
Спецификатор простого типа (7.1.6.2) или typename-specifier (14.6), за которым следует заключенный в скобки список выражений, строит значение указанного типа с учетом списка выражений. [..]
Изучая грамматику, мы видим, что единственный способ получить unsigned char
из производства спецификатора простого типа - это объединить два из них.
Как доказательство развенчания слуха о том, что в таблице 10 говорится об обратном, что я, возможно, сам начал недавно (: P), заголовок таблицы говорит "спецификатор (ы)" (обратите внимание на необязательное множественное число) и ссылается к следующему проходу:
[C++11: 5.2.3/2]:
[..] В таблице 10 приведены допустимые комбинации спецификаторов простого типа и типы, которые они задают. (акцент мой)
Теперь в некоторых случаях допускается комбинирование спецификаторов простого типа:
[C++11: 7.1.6.2/3]:
Если разрешено несколько спецификаторов простого типа, они могут свободно перемешаться с другими спецификаторами-объявлениями в любом порядке. [..]
& hellip; но нет никаких указаний на то, что это имеет место с функциональной нотацией, в которой четко указано " a простой тип-спецификатор" — единственное число.
Поэтому GCC корректен, а Visual Studio ошибочен.
Что касается того, почему это так... ну, я не знаю. Я подозреваю, что мы можем придумать какой-то двусмысленный край, но Casey дает хорошее замечание в комментариях ниже, что позволяет это не соответствовать синтаксису вызова функции, поскольку имена функций не могут иметь пробелов в них.