微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用后声明

如何解决使用后声明

C++20 标准草案 N4861 部分。 6.5.1(7) 读作:

在类 X 之外的定义中使用的名称 X 的完整类上下文应在 ... class 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() << "\n";
}

我的意思是,当然,它确实应该编译,并且确实可以,并且输出42,正如人们所期望的那样;但我不明白标准的措辞。标准说,“在其使用之前”,但在示例中,g() 不是在 after 使用之后声明的吗?还有i

解决方法

你引用的段落的关键部分是

在完整类上下文之外

在成员函数体内,您处于完整类上下文中。这意味着该规则不适用。

完整类的完整定义可以在[class.mem.general]/7中找到:

一个类(模板)的完整类上下文是一个

  • 函数体([dcl.fct.def.general]),
  • 默认参数([dcl.fct.default]),
  • 默认模板参数([temp.param]), noexcept-specifier ([except.spec]),或
  • 默认成员初始化器
,

简单的回答是你没有违反引用的规则。

据我所知,关键部分是“在完整类上下文之外”。我看到您在 g() 中使用了 f(),并且 g() 尚未正式声明,但它在 X 类中。如果 g() 是在 X 之后声明和实现的全局函数,我认为这就是您遇到问题的地方。如果类 X 有一个成员 Y 对象,编译器需要首先了解 Y 的所有信息,以便将其包含在内。这就是规则所说的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。