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

Does the C++ standard explicitly allow/disallow instantiating std::function with incomplete types?

本文关键字:类型 std 函数 实例化 是否 标准 禁止 C++      更新时间:2023-10-16

考虑这样的事情:

class A;
std::function<A(A)> f;

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

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

如果我没看错,该部分

20.5.4.8 其他功能

禁止在实例化时使用不完整类型的模板参数,除非另有指定(不仅适用于容器(。

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

有人知道这是否明确写在标准中吗?

这由库 catch-all [res.on.functions]/2 涵盖

特别是,在以下情况下,效果是不确定的:[...]

  • 如果在实例化模板组件或计算概念时将不完整的类型 ([basic.types]( 用作模板参数,除非该组件特别允许。

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

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

[...]unique_ptr的模板参数 T 可能是不完整的类型。

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

相关文章: