Ses*_*ing 11 c++ function-pointers language-lawyer c++11
class C {
auto (*foo)() -> decltype(this);
};
Run Code Online (Sandbox Code Playgroud)
此代码被GCC,MSVC和clang接受,但不是icc.
小智 7
引用n4140(大致是C++ 14)[expr.prim.general]:
3如果声明声明了类的成员函数或成员函数模板
X,则表达式this是可选的cv-qualifer-seq和函数定义的结尾之间的"指向cv-qualifier-seq的 指针"的prvalue ,成员-declarator或声明者.它不应出现在可选的cv-qualifier-seq之前,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数中) .[...]X4否则,如果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拒绝这个是正确的.
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |