似乎问题不在于this
出现在 a 内部decltype
,而在于它出现在函数体外部。
例如,以下代码在GCC 4.7 下编译:
struct A
{
int f() { return 0; }
auto g() -> decltype(f()) {
decltype(this->f()) var = this->f();
return var;
}
};
这在函数体decltype(this->f())
内部g
使用,但是auto .... -> ....
表单中函数的返回类型规范,即所谓的尾随返回类型规范,不是函数体的一部分,GCC不允许在其中。
但是,看起来(见评论中的讨论)C++ 标准实际上并不要求this
在函数体中使用:标准状态的§5.1.1this
可以在可选的 const/volatile 限定符和结尾之间的任何地方使用函数体,见下文第 3 条。(为了完整起见,我也添加了第 4 条,它讨论了数据成员,与问题没有直接关系)。
(条款 3)如果声明声明了类 X 的成员函数或成员函数模板,则表达式this
是可选 cv-qualifer-seq 和函数定义、成员声明符或声明符。它不应出现在可选的 cv-qualifier-seq
之前,也不应出现在静态成员函数的声明中(尽管它的类型和值类别在静态成员函数中定义,因为它们在非静态成员函数中) . [...]
(第 4 条)否则,如果成员声明符声明类 X 的非静态数据成员(9.2),则表达式 this 是可选大括号或等式初始化器中“指向 X”的类型的纯右值。它不应出现在成员声明符的其他位置。
(第 5 条)this的表达不得出现在任何其他上下文中。[...]
注意:可选的 cv-qualifier-seq,即函数的const
orvolatile
限定符,正如 Jesse 在评论中指出的那样,必须出现在尾随返回类型声明之前。因此this
,以问题中描述的方式使用应该是正确的,而GCC 似乎是错误的。