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

时间:2019-07-19 11:22:31

标签: c++ types std-function

考虑这样的事情:

class A;

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

这显然是您要在程序中执行的操作。任何主要的编译器都接受它而没有问题。

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

如果我没看错的话,该部分

  

20.5.4.8其他功能

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

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

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

1 个答案:

答案 0 :(得分:2)

这由库全部[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,它是未定义的行为。