【问题标题】: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 ::