使用后申报
C++20标准草案N4861第节。6.5.1(7)内容:
在类的定义中使用的名称X
在 应声明X
的完整类上下文...在将其用于 类X
或是X
的基类的成员...
那么为什么要编译以下代码?
#include <iostream>
struct X {
X(const int i_) : i(i_) {}
int f() const { return 3*g(); }
int g() const { return 2*i; }
const int i;
};
int main()
{
const X x{7};
std::cout << x.f() << "
";
}
我的意思是,当然,它确实应该编译,并且确实编译了,输出是42
,正如人们所预期的;但我不理解标准的措辞。标准是在使用之前声明,但在本例中,g()
不是在使用之后声明的吗?和i
。
解决方案
您引用的段落的关键部分是
在完整类上下文之外
在成员函数体中,您处于完整类上下文中。这意味着该规则不适用。
完整类上下文的完整定义位于[class.mem.general]/7:
类(模板)的完整类上下文是
- 函数体([dcl.fct.Def.General]),
- 默认参数([dcl.fct.default]),
- 默认模板参数([temp.param]), NOEXCEPT-说明符([EXCEPT.SPEC])或
- 默认成员初始值设定项
相关文章