示例(编译正常)
struct A
{
void f() {};
auto g() -> decltype(f())
{}
};
问题
如果我在decltype中添加this
指针(即decltype(this->f())
),我会使用gcc 4.7.0获得以下编译错误:
error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
不允许在decltype中使用this
吗?有人可以帮我理解是什么问题吗?
修改
答案 0 :(得分:12)
问题似乎不是this
出现在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 .... -> ....
,但是this
形式的函数返回类型的规范,即称为尾随返回类型规范,不是函数体的一部分,GCC不允许它在那里。
然而,会出现(参见评论中的讨论)C ++标准实际上并不需要在函数体中使用this
:标准状态的第5.1.1节const
可以在可选的const / volatile限定符和函数体末尾之间的任何地方使用,参见下面的第3节。 (为了完整起见,我还添加了第4条,其中涉及数据成员,与问题没有直接关系)。
(第3条)如果声明声明了类X的成员函数或成员函数模板,则表达式 this 是可选的cv-qualifer-seq和结尾之间的“指向cv-quali fi er-seq X的指针”的prvalue function-de fi nition,member-declarator或declarator。 它不会出现在可选的cv-quali fi-seq 之前 它不应出现在静态成员函数的声明中(尽管它的类型和值 类别在静态成员函数中定义,因为它们在非静态成员函数内)。 [...]
(第4条)否则,如果成员声明符声明了类X的非静态数据成员(9.2),则表达式为 是可选的括号或等于初始化程序中“指向X”类型的prvalue。它不会出现在别处 在member-declarator中。
(第5条)表达 this 不得出现在任何其他情况中。 [...]
注意:可选的cv-qualifier-seq ,即该功能的volatile
或this
限定符必须像Jesse在评论中指出的那样显示 之前尾随返回类型声明。因此,以问题中描述的方式使用{{1}}应该是正确的,并且 GCC似乎是错误的。
答案 1 :(得分:1)
错误消息似乎很清楚:'this'是'struct A'的一个实例,它是一个不完整的类型(即编译器在当前传递期间尚未完成解析结构)。