【问题标题】:Is this function pointer with `this` in trailing return type legal?尾随返回类型中带有“this”的函数指针是否合法?
【发布时间】:2018-04-20 07:04:26
【问题描述】:
class C {
  auto (*foo)() -> decltype(this);
};

GCC、MSVC 和 clang 接受此代码,但不接受 icc。

【问题讨论】:

标签: c++ c++11 language-lawyer function-pointers


【解决方案1】:

引用 n4140(大致 C++14)[expr.prim.general]:

3 如果声明声明了类X 的成员函数或成员函数模板,则表达式this 是“指向cv-qualifier-seq X 的指针类型的纯右值" 在可选的 cv-qualifer-seqfunction-definitionmember-declaratordeclarator 的结尾之间时间>。它不应出现在可选的 cv-qualifier-seq 之前,并且不应出现在静态成员函数的声明中(尽管它的类型和值类别在静态成员函数中定义,因为它们在非静态成员函数)。 [...]

4 否则,如果 member-declarator 声明类 X 的非静态数据成员 (9.2),则表达式 this 是“指向 X 的指针”类型的纯右值在可选的 brace-or-equal-initializer 中。它不应出现在 member-declarator 的其他地方。

由于您没有声明成员函数或成员函数模板,因此 p3 不适用,但这会使代码对您实际声明成员函数的非指针情况有效:尾随返回类型位于可选的 cv-qualifier-seq 和声明符的结尾之间,正如const 成员函数的定义中更清楚的那样:

auto foo() const -> decltype(this) { }

p4 在这里适用。它只允许this 出现在初始化程序中。你把它放在别处了。 p3 不适用,所以 ICC 拒绝这个是正确的。

【讨论】:

  • 你不觉得第一句的结尾与开头不匹配吗?我的意思是,在开始时,只有成员函数被列为 this 具有特定含义的上下文,但最后它以某种方式假设这样的上下文还包括 member-declarator 或 declarator。还是有什么东西以成员函数声明开始但以声明者结束?结局让我觉得 p3 确实适用。
  • @VTT 不,那只是因为根据上下文,成员函数或成员函数模板声明可能采用 function-definition 的形式(如果它包括一个定义),一个member-declarator(如果它出现在没有定义的类中),或者一个declarator(如果它出现在一个没有定义的类之外)。
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多