小智 7

引用n4140(大致是C++ 14)[expr.prim.general]:

3如果声明声明了类的成员函数或成员函数模板X,则表达式this是可选的cv-qualifer-seq函数定义的结尾之间的"指向cv-qualifier-seq的 指针"的prvalue ,成员-declarator声明者.它不应出现在可选的cv-qualifier-seq之前,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数中) .[...]X

4否则,如果member-declarator声明了类的非静态数据成员(9.2)X,则表达式是X可选的brace-or-equal-initializer中的 "指向" 的类型的prvalue .它不应出现在成员声明者的其他地方.

由于您没有声明成员函数或成员函数模板,因此p3不适用,但这将使代码对您实际声明成员函数的非指针情况有效:尾随返回类型介于可选的cv-qualifier-seq和声明的结尾,在const成员函数的定义中更清楚:

auto foo() const -> decltype(this) { }
Run Code Online (Sandbox Code Playgroud)

p4适用于此处.它只允许this出现在初始化器中.你把它放在其他地方.p3不适用,所以ICC拒绝这个是正确的.