C ++ 11 decltype成员

时间:2014-10-05 04:09:30

标签: c++ c++11

为什么我不能这样做:

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,...的操作数)中,您可以在成员函数之外命名非静态数据成员

1 个答案:

答案 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 的少数上下文之一,因此该程序格式不正确。