c – 在指向成员的指针声明中使用’decltype’有效吗?

前端之家收集整理的这篇文章主要介绍了c – 在指向成员的指针声明中使用’decltype’有效吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
想像一下这个奇怪的原因:
int main()
{
    struct S
    {        
        int i;
    } var;


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

GCC似乎编译很好,虽然Clang失败了一些不确定的语法相关的错误信息.

那么圣洁的ISO文件对此有什么看法 – 这是否有效?

解决方法

这实际上是Clang的 known bug.

代码有效.

N4140 [dcl.mptr] / 1:

In a declaration T D where D has the form

nested-name-specifier * attribute-specifier-seqopt cv-qualifier-seqopt D1

and the nested-name-specifier denotes a class,and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”,then the type of the identifier of D is “derived-declarator-type-list cv-qualifier-seq pointer
to member of class nested-name-specifier of type T”. The optional attribute-specifier-seq (7.6.1) appertains to
the pointer-to-member.

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

nested-name-specifier:

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

猜你在找的C&C++相关文章