这个函数指针的尾部返回类型为"this"合法吗
Is this function pointer with `this` in trailing return type legal?
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拒绝这一点是正确的。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 关于C++中具有多重继承"this"指针的说明
- 在noexcept 规范中是否允许使用"this"?
- 如何修复"error: ‘_1’ was not declared in this scope"?
- C++调用具有 *this 属性的单个帮助程序函数
- Doees the 'this' 指针参与虚函数的多态行为
- 在 c++ 中正确定义"this"关键字?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- QObject::连接无法将信号连接到*this*对象的插槽
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- 为什么我需要在转换构造函数上引用 this->?
- "this"指针的值在对象的生存期内是否恒定?
- C++ "Invalid use of 'this' in non-member function" ,
- 如何将'this'指针传递给C++ WinAPI 线程?