在指向成员的指针声明中使用'decltype'是否有效?

AnA*_*ons 10 c++ iso decltype pointer-to-member language-lawyer

想象一下我写这个奇怪的原因:

int main()
{
    struct S
    {        
        int i;
    } var;


    int decltype(var)::* pint = &decltype(var)::i;
}
Run Code Online (Sandbox Code Playgroud)

GCC似乎编译得很好,尽管Clang失败了一些不确定的语法相关错误消息.

那么神圣的ISO论文对此有何评论 - 这是否有效?

Ant*_*vin 12

这实际上是Clang中的已知错误.

代码有效.

N4140 [dcl.mptr]/1:

在具有表格 的声明T DD

nested-name-specifier * attribute-specifier-seq opt cv-qualifier-seq opt D1

并且nested-name-specifier表示一个类,声明中标识符的类型T D1是" derived-declarator-type-listT ",然后标识符的类型D是" derived-declarator-type-list cv-qualifier" -seq指向类型为T" 的类nested-name-specifier的成员".可选的attribute-specifier-seq(7.6.1)属于指向成员的指针.

在这个定义中,我们对嵌套名称说明符感兴趣,它在[expr.prim.general]/8中定义为(强调我的):

嵌套名称说明符:

:: type-name ::
namespace-name ::
decltype-specifier::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id::