class C {
auto (*foo)() -> decltype(this);
};
此代码被GCC,MSVC和clang接受,但不是icc。
答案 0 :(得分:7)
引用n4140(大致是C ++ 14)[expr.prim.general]:
3如果声明声明了类
X
的成员函数或成员函数模板,则表达式this
是类型为“指向 cv-qualifier-seqX
“在可选的 cv-qualifer-seq 和功能定义的末尾,成员声明符之间,或者声明符。它不应出现在可选的 cv-qualifier-seq 之前,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数)。 [...]4否则,如果 member-declarator 声明类
X
的非静态数据成员(9.2),则表达式为“指向{{的指针”的prvalue 1}}“在可选的大括号或等于初始化程序中。它不会出现在 member-declarator 的其他地方。
由于您没有声明成员函数或成员函数模板,因此p3不适用,但这将使代码对您实际声明成员函数的非指针情况有效:尾随返回类型在可选的 cv-qualifier-seq 和声明符的结尾之间,在X
成员函数的定义中更清楚:
const
p4适用于此。它只允许auto foo() const -> decltype(this) { }
出现在初始化程序中。你把它放在其他地方。 p3不适用,所以ICC拒绝这一点是正确的。