【问题标题】:Why is std::function itself a copy-constructible type?为什么 std::function 本身是可复制构造的类型?
【发布时间】:2017-10-06 17:41:18
【问题描述】:

我发现规范的 tr.func.require 部分要求 std::function 在 C++11 中是可复制构造的,并且我已经看到很多解释为什么这意味着函子曾经构造 std::function 必须是可复制的,但是为什么 C++11 标准首先使 std::function 可复制,而不是使其成为仅移动类型?

【问题讨论】:

  • 可能是因为标准定义的很多(可能是全部,不记得了)算法允许复制传递给它们的函子。
  • std::function 应该像 C 函数指针一样可用,否则它将毫无用处。这意味着不受限制的哄骗。如果我想在两个不同的位置存储一个函数的副本,我将如何使用仅移动函数来做到这一点?
  • NathanOliver,这个要求在任何地方都有明确说明吗?抽查,除了(到目前为止)在 C++17 中引入的 for_each 的并行版本之外,我在大多数算法中都没有发现任何此类要求。
  • 我们需要std::unique_function

标签: c++ c++11


【解决方案1】:

std::function 是在 C++11 之前实现的,当时还没有移动语义(它源自 boost::function,是 TR1 的一部分)。

我的猜测是 std::function 在移动语义之前被指定(并且可能被投票加入标准)。鉴于此,他们没有时间审查标准的所有其余部分。另请参阅this answer 关于why shared_ptr deleters have to be CopyConstructible

此外,出于兼容性原因,突然将std::function 移动为可构造函数并删除其复制构造函数听起来不合理。

【讨论】:

  • 你确定吗? en.cppreference.com/w/cpp/utility/functional/function 表明 std::function 是在 C++11 中引入的。
  • @PeterMilley:是的,但是产生 C++11 的过程花了大约 4 年的时间。 std::function 首先被添加到 C++11,然后移动语义被添加到 C++11。他们选择“发布”C++11,而不是详细审查所有现有算法。
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 2013-03-29
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多