【问题标题】:C++11 decltype of memberC++11 decltype 成员
【发布时间】:2014-10-05 13:03:51
【问题描述】:

为什么我不能这样做:

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

【问题讨论】:

  • 请注意,函数不是数据成员。
  • decltype 接受一个表达式。 fn 本身不是一个表达式。
  • @dyp 但它可以单独出现吗?我似乎记得有一些关于成员函数名称如何仅出现在函数调用或&ClassName::FunctionName 中的内容。
  • @IgorTandetnik 我认为它可能不会出现在这种情况下。它是&Foo::fnfn(),但它是一个表达式。 [expr.prim.general]/13
  • @IgorTandetnik 是的,我只是检查了标准,你是对的。 cppreference.com 说它也可能需要一个 entity - 我猜这让我失望。无论如何我可以做我想做的事吗?

标签: c++ c++11


【解决方案1】:

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

【讨论】:

  • 哦,因为它不是数据成员......它是一个成员函数。我懂了。感谢您的参考!没找到
  • 如何才能对标准如此了解?
  • @user70869 几年来经常提到它,每当有疑问时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多