考虑这样的事情:
class A;
std::function<A(A)> f;
这显然是您要在程序中执行的操作。任何主要的编译器都接受它而没有问题。
我的问题是:该标准在技术上允许吗?
如果我没看错的话,该部分
20.5.4.8其他功能
除非另有说明(并且不仅针对容器),否则禁止在实例化时使用不完整类型的模板参数。
在关于std::function
或<functional>
的部分中,我看不到允许这样做的参考。
有人知道这在标准中明确写在什么地方吗?
答案 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,它是未定义的行为。