使用后申报

2022-07-18 00:00:00 standards c++ name-lookup
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])或
  • 默认成员初始值设定项

相关文章