Jes*_*ood 16 c++ gcc decltype c++11
示例(编译好)
struct A
{
void f() {};
auto g() -> decltype(f())
{}
};
Run Code Online (Sandbox Code Playgroud)
题
如果我this
在decltype(ie 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'
Run Code Online (Sandbox Code Playgroud)
是否this
允许在decltype中使用?有人能帮我理解是什么问题吗?
编辑
jog*_*pan 12
似乎问题不是this
出现在a内部decltype
,而是出现在函数体外部.
对于例如,下面的代码下面GCC 4.7编译下:
struct A
{
int f() { return 0; }
auto g() -> decltype(f()) {
decltype(this->f()) var = this->f();
return var;
}
};
Run Code Online (Sandbox Code Playgroud)
这decltype(this->f())
在 body的内部使用g
,但是auto .... -> ....
表单中函数的返回类型的规范,即所谓的尾随返回类型规范,不是函数体的一部分,GCC不允许它在那里.
但是,看起来(参见评论中的讨论)C++标准实际上并不需要this
在函数体中使用:标准状态的第5.1.1节this
可以在可选的const/volatile限定符和结尾之间的任何地方使用功能机构,见下文第3条.(为了完整起见,我还添加了第4条,其中涉及数据成员,与问题没有直接关系).
(第3)如果一个声明声明一个类X的成员函数或成员函数模板,表达这 是类型的可选CV-限定符-SEQ和的端部之间的prvalue"指针CV-合格音响ER-SEQ X"函数定义,成员声明者或声明者.它不应出现在可选的cv-quali-seq之前 ,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数中) .[...]
(第4条)否则,如果member-declarator声明类X 的非静态数据成员(9.2),则表达式是可选的brace-or-equal-initializer中的 "指向X的指针"的prvalue .它不应出现在成员声明者的其他地方.
(第5章)中的表达此不应出现在任何其他上下文.[...]
注意:可选的cv-qualifier-seq,即函数的const
or或volatile
限定符必须像Jesse在注释中指出的那样出现在尾随返回类型声明之前.因此this
,以问题中描述的方式使用应该是正确的,并且GCC似乎是错误的.
归档时间: |
|
查看次数: |
1239 次 |
最近记录: |