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

5

考虑以下内容:

class A;

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

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

我的问题是:是否符合技术标准?

如果我看得正确,章节

20.5.4.8其他函数

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

在关于std::function<functional>的章节中,我没有看到允许此操作的参考。

有人知道这是在标准的哪个位置明确写出来的吗?


从“最新”标准版本中:“[...]效果未定义[...]”res.on.functions。因此,我认为对于实现没有要求,它可能会接受这一点。 - BiagioF
1个回答

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 并将其视为未定义行为。

这是我的猜测。所有主要的编译器是否应该发出警告(例如使用pedantic的GCC),或者应该允许在标准中使用?我在这里看到一个小缺陷,不管是来自编译器还是标准。(沿用http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4371.html的思路) - FilippoL
@FilippoL 好的,在未定义行为的情况下,不需要发出警告。 - BiagioF
根据此文,编译器不需要诊断未定义行为。 - NathanOliver
@NathanOliver 我们确定这是实际的未定义行为吗?标准不是让编译器选择接受代码作为有效(无 UB)的选择吗? - BiagioF
@BiagioFesta [res.on.functions]/2 表示效果未定义 - NathanOliver
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接