如何解决使用后声明
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 举报,一经查实,本站将立刻删除。