gpt4 book ai didi

c++ - 为什么类中不需要 'Declare before use' 规则?

转载 作者:IT老高 更新时间:2023-10-28 23:14:22 24 4
gpt4 key购买 nike

我想知道为什么 C++ 的使用前声明规则在类中不成立。

看这个例子:

#ifdef BASE
struct Base {
#endif
struct B;
struct A {
B *b;
A(){ b->foo(); }
};

struct B {
void foo() {}
};
#ifdef BASE
};
#endif

int main( ) { return 0; }

如果定义了BASE,则代码有效。

在 A 的构造函数中,我可以使用尚未声明的 B::foo。

为什么这行得通,而且大多数情况下,为什么只能在内部类中工作?

最佳答案

好吧,为了迂腐,C++ 中没有“使用前声明规则”。 名称查找的规则非常复杂,但可以(并且经常)粗略地简化为通用的“使用前声明规则”,但有一些异常(exception)。 (在某种程度上,这种情况类似于“运算符优先级和关联性”规则。虽然语言规范没有这样的概念,但我们经常在实践中使用它们,尽管它们并不完全准确。)

这实际上是这些异常(exception)之一。 C++ 中的成员函数定义被明确且有意地排除在“使用前声明规则”之外,从某种意义上说,从这些成员的主体中执行名称查找就像它们是在类定义之后定义的一样。

语言规范在 3.4.1/8(和脚注 30)中声明了这一点,尽管它使用了不同的措辞。它表示在从成员函数定义中查找名称期间,会检查 整个 类定义,而不仅仅是成员函数定义 上方 的部分。脚注 30 还指出,尽管在类定义内部或类定义外部定义的函数的查找规则是相同的(这与我上面所说的差不多)。

你的例子有点不重要。它提出了关于嵌套类中成员函数定义的直接问题:是否应该将它们解释为好像它们是在定义最封闭的类之后定义的?答案是肯定的。 3.4.1/8 也涵盖了这种情况。

“C++ 的设计与演变”一书描述了这些决定背后的原因。

关于c++ - 为什么类中不需要 'Declare before use' 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com