首页 > 解决方案 > C++ 标准是否明确允许/禁止使用不完整类型实例化 std::function?

问题描述

考虑这样的事情:

class A;

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

这显然是你想在你的程序中做的事情。任何主要的编译器都可以毫无问题地接受这一点。

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

如果我没看错,该部分

20.5.4.8 其他功能

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

在关于std::function<functional>我看不到允许这样做的部分中。

有人知道在哪里以及是否在标准中明确写入了吗?

标签: c++typesstd-function

解决方案


这由库包罗万象 [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 并且它是未定义的行为。


推荐阅读