这个函数指针在尾随返回类型中是否为“this”是合法的?

时间:2017-11-07 18:49:03

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

class C {
  auto (*foo)() -> decltype(this);
};

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

1 个答案:

答案 0 :(得分:7)

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

  

3如果声明声明了类X的成员函数或成员函数模板,则表达式this是类型为“指向 cv-qualifier-seq X“在可选的 cv-qualifer-seq 功能定义的末尾,成员声明符之间,或者声明符。它不应出现在可选的 cv-qualifier-seq 之前,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数)。 [...]

     

4否则,如果 member-declarator 声明类X的非静态数据成员(9.2),则表达式为“指向{{的指针”的prvalue 1}}“在可选的大括号或等于初始化程序中。它不会出现在 member-declarator 的其他地方。

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

const

p4适用于此。它只允许auto foo() const -> decltype(this) { } 出现在初始化程序中。你把它放在其他地方。 p3不适用,所以ICC拒绝这一点是正确的。