C ++标准是否明确允许/禁止使用不完整类型实例化std :: function?

Fil*_*poL 5 c++ types std-function

考虑这样的事情:

class A;

std::function<A(A)> f;
Run Code Online (Sandbox Code Playgroud)

显然,这是您要在程序中执行的操作。任何主要的编译器都可以毫无问题地接受它。

我的问题是:该标准在技术上允许吗?

如果我没看错的话

20.5.4.8其他功能

除非另有说明(并且不仅针对容器),否则禁止在实例化时使用不完整类型的模板参数。

在关于std::function<functional>我没有看到允许这样做的参考部分。

有人知道这在标准中明确写在什么地方吗?

Nat*_*ica 2

这是由库包[res.on.functions]/2涵盖的

\n
\n

特别是,在以下情况下效果未定义:[...]

\n
    \n
  • 如果在实例化模板组件或评估概念时使用不完整类型([basic.types])作为模板参数,除非该组件特别允许。
  • \n
\n
\n

由于[func.wrap.func]中没有任何内容覆盖这一点,因此具有不完整的函数类型是未定义的行为。

\n

作为您需要在 [func.wrap.func] 中看到的内容的示例,让我们看一下[unique.ptr]/4

\n
\n

[...] unique_\xc2\xadptr 的模板参数 T 可能是不完整类型。

\n
\n

这里明确指出允许不完整的类型。我们在 [func.wrap.func] 中需要类似的东西,但我们不需要,所以我们回到 [res.on.functions]/2 ,它是未定义的行为。

\n