想象一下我写这个奇怪的原因:
int main()
{
struct S
{
int i;
} var;
int decltype(var)::* pint = &decltype(var)::i;
}
GCC似乎编译得很好,尽管Clang因一些不确定的语法相关错误消息而失败。
那么神圣的ISO论文对此有何评价 - 这是否有效?
答案 0 :(得分:12)
这实际上是Clang中的known bug。
代码有效。
N4140 [dcl.mptr] / 1:
在声明
T D
中D
的格式为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::