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

时间:2015-07-03 12:05:21

标签: c++ language-lawyer iso decltype pointer-to-member

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

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


    int decltype(var)::* pint = &decltype(var)::i;
}

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

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

1 个答案:

答案 0 :(得分:12)

这实际上是Clang中的known bug

代码有效。

N4140 [dcl.mptr] / 1:

  

在声明T DD的格式为

     

nested-name-specifier * attribute-specifier-seq opt cv-qualifier-seq opt { {1}}

     

nested-name-specifier 表示一个类,声明D1中的标识符类型是“ derived-declarator-type-list {{1 }} “,然后T D1标识符的类型是” derived-declarator-type-list cv-qualifier-seq 指针   到类型T的类nested-name-specifier的成员。可选的 attribute-specifier-seq (7.6.1)属于   指向成员的指针。

在这个定义中,我们对 nested-name-specifier 感兴趣,并且它在[expr.prim.general] / 8中定义为(强调我的):

  

嵌套名称说明符:

     

D   类型名称T
  namespace-name ::
   decltype-specifier ::
  嵌套名称说明符标识符::
  嵌套名称说明符:: opt simple-template-id ::