【问题标题】:Does the C++ standard explicitly allow/disallow instantiating std::function with incomplete types?C++ 标准是否明确允许/禁止使用不完整类型实例化 std::function?
【发布时间】:2019-07-19 11:22:31
【问题描述】:

考虑这样的事情:

class A;

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

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

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

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

20.5.4.8 其他功能

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

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

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

【问题讨论】:

  • 来自“最新”版本的标准:"[...] 效果未定义 [...]"res.on.functions。所以我认为对实现没有要求,它可以接受

标签: c++ types std-function


【解决方案1】:

这已被库全部覆盖[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 并且它是未定义的行为。

【讨论】:

  • 这是我的怀疑。所有主要编译器都应该发出警告(例如带有迂腐的 GCC),还是应该在标准中允许?我在这里看到了一个小缺陷,无论是来自编译器还是来自标准。 (沿线open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4371.html
  • @FilippoL 好吧,在未定义行为的情况下不需要发出警告
  • @FilippoL 根据this,编译器不需要诊断未定义的行为。
  • @NathanOliver 我们确定这是一个真正的 UB 吗?标准不是让编译器选择接受有效的代码(没有UB)吗?
  • @BiagioFesta [res.on.functions]/2 说 效果未定义
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 2022-01-19
  • 2017-11-21
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多