gpt4 book ai didi

c++ - 为什么一个类在成员函数定义中可以在自身内部使用,但作为成员使用时却被认为是不完整的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:18 25 4
gpt4 key购买 nike

class A
{
private:
A a;
};

为什么类中的 A 是不完整的类型?

class A
{
public:
A& operator= (A a){return *this;}
};

operator=的参数A不是不完整类型吗?为什么上面的代码可以编译?

最佳答案

因为在类定义的空白处使用 A 和在成员函数定义的参数列表中使用它是有区别的。这是两个不同的范围。

[C++11: 9.2/2]: A class is considered a completely-defined object type (3.9) (or complete type) at the closing } of the class-specifier. Within the class member-specification, the class is regarded as complete within function bodies, default arguments, exception-specifications, and brace-or-equal-initializers for non-static data members (including such things in nested classes). Otherwise it is regarded as incomplete within its own class member-specification.

然后是以下特例:

[C++11: 8.3.5/9]: Types shall not be defined in return or parameter types. The type of a parameter or the return type for a function definition shall not be an incomplete class type (possibly cv-qualified) unless the function definition is nested within the member-specification for that class (including definitions in nested classes defined within the class).

“就是这样。”

实际上,显然不可能将A存储在A中(因为这需要无限封装),而事实显然不是这样在成员函数的参数列表中。因此,标准委员会有机会让这对我们来说更容易一些,他们接受了。

此外,如果您尝试在函数的 定义 中使用 a 的成员,那么这也是允许的(根据上面的第一条引述),就好像该函数已在类定义结束后按词法声明。

关于c++ - 为什么一个类在成员函数定义中可以在自身内部使用,但作为成员使用时却被认为是不完整的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29302272/

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