【问题标题】:Is using 'decltype' in the declaration of pointer to member valid?在指向成员的指针的声明中使用“decltype”是否有效?
【发布时间】:2015-07-03 12:05:20
【问题描述】:

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

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


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

GCC 似乎可以很好地编译它,尽管Clang 失败并出现一些不确定的语法相关错误消息。

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

【问题讨论】:

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


    【解决方案1】:

    这实际上是 Clang 中的 known bug

    代码有效。

    N4140 [dcl.mptr]/1:

    T D 的声明中,D 的格式为

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

    nested-name-specifier表示一个类,声明T D1中的标识符类型为“derived-declarator-type-list T em>”,那么D的标识符的类型就是“derived-declarator-type-list cv-qualifier-seq指针 到 T 类型的类嵌套名称说明符的成员”。可选的 attribute-specifier-seq (7.6.1) 属于 指向成员的指针。

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

    嵌套名称说明符:

    :: 类型名称::
    命名空间名称::
    decltype-specifier ::
    嵌套名称说明符标识符::
    嵌套名称说明符 templateopt 简单模板 ID ::

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2016-08-14
      相关资源
      最近更新 更多