为什么我不能这样做:
class Foo {
void fn();
using fn_t = decltype(fn); //call to non-static member function without an object argument
};
Run Code Online (Sandbox Code Playgroud)
但我能做到
class Foo {
static void fn();
using fn_t = decltype(fn);
};
Run Code Online (Sandbox Code Playgroud)
这篇SO帖子声称:
在未评估的操作数(decltype,sizeof,noexcept,...的操作数)中,您可以在成员函数之外命名非静态数据成员
fn是一个有效的id-expression,表示非静态成员函数.§5.1.1[expr.prim.general]/p13(省略脚注):
只能使用表示非静态数据成员或类的非静态成员函数的id表达式:
- 作为类成员访问(5.2.5)的一部分,其中对象表达式引用成员的类或从该类派生的类,或者
- 形成指向成员(5.3.1)的指针,或
- 如果该id-expression表示非静态数据成员,则它出现在未评估的操作数中.
§7.1.6.2[dcl.type.simple]/p4:
说明符的操作数
decltype是未评估的操作数(第5条).
由于decltype不是可以使用表示非静态成员函数的id表达式的少数上下文之一,因此该程序是不正确的.