在 decltype 中使用 this 指针
Using the this pointer inside decltype
示例(编译正常)
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
?有人可以帮助我了解问题所在吗?
编辑
这已被归档为错误。
似乎问题不在于this
出现在decltype
内部,而是它出现在函数体之外。
例如,下面的代码在 GCC 4.7 下编译:
struct A
{
int f() { return 0; }
auto g() -> decltype(f()) {
decltype(this->f()) var = this->f();
return var;
}
};
这在g
体内使用decltype(this->f())
,但是auto .... -> ....
形式的函数返回类型的规范,即所谓的尾随返回类型规范,不是函数体的一部分,GCC不允许它在那里。
但是,看起来(请参阅评论中的讨论)C++标准实际上并不要求在函数体中使用this
:标准的§5.1.1规定,this
可以在可选的常量/可变限定符和函数体末尾之间的任何地方使用,请参阅下面的第3条。(为了完整起见,我还添加了第 4 条,该条款涉及数据成员,与问题没有直接关系)。
(第3条)如果声明声明了类X的成员函数或成员函数模板,则表达式为this 是可选的 cv-qualifer-seq 和 函数定义、成员声明符或声明符。它不应出现在可选的 cv 限定符-seq 之前 并且它不应出现在静态成员函数的声明中(尽管它的类型和值 类别在静态成员函数中定义,因为它们在非静态成员函数中定义)。[...]
(条款 4)否则,如果成员声明符声明了类 X 的非静态数据成员 (9.2),则表达式为 this 是可选大括号或等于初始值设定项中类型为"指向 X 的指针"的 prvalue。它不应出现在其他地方 在成员声明符中。
(第5条)"这句话"的表述不得出现在任何其他上下文中。[...]
注意:可选的 cv-qualifier-seq,即函数的 const
或 volatile
限定符,正如 Jesse 在注释中指出的那样,必须出现在尾随返回类型声明之前。因此,以问题中描述的方式使用this
应该是正确的,而 GCC 似乎是错误的。
错误消息似乎很清楚:"this"是"struct A"的一个实例,它是一个不完整的类型(即编译器在当前传递期间尚未完成结构解析)。
- 为什么使用 "this" 指针调用派生成员函数?
- 关于C++中具有多重继承"this"指针的说明
- Doees the 'this' 指针参与虚函数的多态行为
- 为什么成员函数内的"this"指针为空?
- "this"指针的值在对象的生存期内是否恒定?
- 如何将'this'指针传递给C++ WinAPI 线程?
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- 'this'指针是否可以在 c++ 标头声明中使用?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- C++虚拟方法,不需要"this"指针 - 优化
- 指向成员函数签名的指针中缺少"this"指针
- 是否可以获取'this'指针的地址?
- 静态类成员不是与 this 指针没有关联吗?
- 为什么有必要将"this"指针作为"arg"参数传递给pthread_create
- 编译错误:2 个重载没有'this'指针的合法转换。使用结构
- 对象的"this"指针是否等于指向其(单个)基类的指针?
- Do=在lambda的捕获列表中捕获this指针
- 将"this"指针传递给析构函数中的其他类/函数