这个函数指针的尾部返回类型为"this"合法吗

Is this function pointer with `this` in trailing return type legal?

本文关键字:quot this 函数 指针 返回类型 尾部      更新时间:2023-10-16
class C {
auto (*foo)() -> decltype(this);
};

GCC、MSVC和clang接受此代码,但不接受icc。

报价n4140(大致为C++14)[expr.prim.general]:

3如果一个声明声明了类X的成员函数或成员函数模板,则表达式this是类型为"的prvalue;指向cv限定符seqX的指针";在可选的cv qualifer-seq函数定义的末尾成员声明符声明符v限定符seq之前,也不得出现在静态成员函数的声明中(尽管其类型和值类别在静态成员功能中定义为在非静态成员功能内定义)。[…]

4否则,如果成员声明符声明类X的非静态数据成员(9.2),则表达式this是类型为"0"的prvalue;指向CCD_ 5的指针";在可选的大括号或相等的初始值设定项中。它不应出现在成员声明符的其他位置。

由于您没有声明成员函数或成员函数模板,p3不适用,但这将使代码对实际声明成员函数的非指针情况有效:尾部返回类型介于可选的cv限定符seq和声明符末尾之间,const成员函数的定义更清楚地表明了这一点:

auto foo() const -> decltype(this) { }

p4在这里适用。它只允许this出现在初始化程序中。你把它放在别处了。p3不适用,所以ICC拒绝这一点是正确的。