哪里需要(不需要)完整的类型?

Set*_*gie 3 c++ incomplete-type

我最近惊讶地发现这段代码可以编译(至少在 gcc 和 MSVC++ 上):

template<typename T>
class A {
public:
    T getT() { return T(); }
};

class B : public A<B> { };
Run Code Online (Sandbox Code Playgroud)

当这没有发生时:

class A;

class B : public A { };

class A {
public:
    B getB() { return B(); }
};
Run Code Online (Sandbox Code Playgroud)

对我来说,模板类可以采用不完整的类型作为模板参数,并且有一个函数通过调用其构造函数返回一个类型,并且仍然可以编译,这对我来说似乎很奇怪。那么到底哪里需要完整的类型(或者如果列表更短,哪里不需要它们)?

Alo*_*ave 6

以下是不需要 Complete 类型的场景:

  • 将成员声明为不完整类型的指针或引用。
  • 声明接受/返回不完整类型的函数。
  • 定义接受/返回不完整类型的指针/引用的函数。
  • 作为模板类型参数。

基本上,您可以在编译器不需要知道type.

至于允许模板类型参数为不完整类型,标准在14.3.1 模板类型参数中明确说明了这一点