Ответ 1
Это фактически известная ошибка в Clang.
Код действителен.
N4140 [dcl.mptr]/1:
В объявлении
T D
, гдеD
имеет формуnested-name-specifier
*
attribute-specifier-seq opt cv-qualifier-seq optD1
а спецификатор вложенных имен обозначает класс, а тип идентификатора в объявлении
T D1
- это "производный-декларатор-тип-списокT
", тогда тип идентификатораD
msgstr "выведенный-declarator-type-list cv-qualifier-seq pointer член класса вложенного имени-спецификатора типаT
". Необязательный атрибут-спецификатор-seq (7.6.1) относится к указатель на элемент.
В этом определении нас интересует спецификатор вложенных имен и он определен в [expr.prim.general]/8 как (основное внимание):
вложен имя спецификатор:
::
имя-типа::
namespace-name::
decltype-specifier::
Идентификатор идентификатора вложенного имени::
inest-name-specifiertemplate
opt simple-template-id::