【问题标题】:Does copy operator= exist for std::pairstd::pair 是否存在复制运算符 =
【发布时间】:2021-09-02 22:53:16
【问题描述】:

我遇到了一个问题。从 lambda 函数返回 std::pair 。 我正在尝试使用打开的 ifstream 生成地图,但编译器抱怨此输出:

/usr/include/c++/9/bits/stl_algo.h:4337:12: 错误:使用已删除的函数 'std::pair& std ::pair::operator=(const std::pair&)'

我查看了 std::pair 的 cppref ,但我没有注意到 copy operator= 不适用于这个。

我相当确定返回对的 lambdas 是可能的,那么我在下面的 sn-p 中肯定有一些误解。

std::map<int, std::string> mFileMap;
std::map<std::string, std::ifstream> files;
std::transform(mFileMap.begin(), mFileMap.end(), files.begin(),
                [](const auto& arg) -> std::pair<std::string, std::ifstream> {
                    std::string path(arg.second);
                    std::ifstream stream(path);
                    return std::make_pair(path, stream);
                });

【问题讨论】:

标签: c++


【解决方案1】:

std::pair 只能在 std::pair 中的任何内容是可复制的情况下才能复制。如果您考虑几秒钟,您会同意这是 100% 有道理的。

std::pair<std::string, std::ifstream> 

std::ifstream 不可复制。您不能复制std::ifstreams。将其放在 std::pair 中不会使其可复制。

但这并不是显示代码中最不重要的问题:

std::map<std::string, std::ifstream> files;
std::transform(mFileMap.begin(), mFileMap.end(), files.begin(),
      // ...

files 映射为空。 files.begin() 会将起始迭代器返回到一个空映射,该映射与 files.end() 的值相同。尝试复制到结束迭代器(忽略底层类型不可复制的事实)不会很好地结束。

另外,std::map 的密钥在地图中是不变的,所以这也不起作用。

这不是将东西添加到地图的方式,需要使用std::insert_iterator

所以,总而言之,必须解决以下问题:

  1. std::pair 不可复制。
  2. 必须使用std::insert_iterator 将新的键/值对插入std::map

假设您坚持让您的 std::map 包含这些值,您将不得不做一些工作来填充它,使用 std::map::emplace,这将是将新事物放入此地图的最实用的方法。

【讨论】:

    【解决方案2】:

    感谢 Sam,我找到了解决此问题的方法。 因此,一种可能的解决方法是

    std::map<std::string, std::ifstream> files;
    std::transform(mFileMap.begin(), mFileMap.end(), std::inserter(files, files.end()),
                    [](auto const& arg) -> std::pair<std::string, std::ifstream> {
                        std::string path(arg.second);
                         return std::make_pair(path, std::ifstream(path));
                      });
    

    【讨论】:

    • 这确实充分利用了强制复制省略,以避免实际需要复制不可复制的对象。但是,这似乎确实有效。
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 2015-09-25
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多