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