2

据我所知,在定义具有对象返回类型的函数时,该类仅处于其前向声明状态,如下所示:

class A; 

// 前向声明,将A设置为不完整类型

A foo(){...} 

//error: A 是一个不完整的类型,我知道当它具有指针的返回类型或对该对象的引用时它可以正常工作。

但是当我定义一个返回类型作为其类的方法时:

class B{
  public:
    B foo(){...}
}

它工作得很好。

我认为在类的定义中定义方法时,类仍然是不完整的类型。所以我认为它会提示类似于前者的错误,但它没有。有谁知道为什么?

在在这里寻求帮助之前,我已经搜索了很长时间。(我不擅长英语,所以我的描述可能会让你感到困惑。抱歉。)

4

2 回答 2

3

在类中定义方法时,该类被视为一个完整类型,否则我们将无法定义内联方法。此外,如果您的 A 类是不完整的类型,那么奇怪的重复模板模式也将不起作用。考虑以下代码:

template <typename T> struct base {};

struct derived : base<derived> {};  // We can use derived here
                                    // without any "incomplete type"
                                    // errors.

换句话说:这就是语言的工作方式。

编辑:有关提及此行为的 C++ 标准的相关部分,请参阅 Mike Seymour 的下文。

于 2013-03-18T13:35:39.160 回答
2

在大多数情况下,您无法定义返回不完整类型的函数是正确的。但是,规则有一些例外情况,允许在其自己的定义中使用类。

按照 C++11 8.3.5/9 的规定,B即使此时不完整,也可以为其成员函数之一声明返回类型:B

函数定义的参数类型或返回类型不应是不完整的类类型(可能是 cv 限定的),除非函数定义嵌套在该类的成员规范中

B实例化一个类型的对象以在函数体中返回也很好;在类定义中,类在包括函数体在内的各种上下文中被认为是完整的,如 C++11 9.2/2 所指定:

在类成员规范中,类在函数体、默认参数、异常规范和非静态数据成员(包括嵌套类中的此类内容)的大括号或等号初始化器中被视为完整。否则,它在其自己的类成员规范中被视为不完整 。

于 2013-03-18T14:33:17.157 回答