for-each 循环生成错误,但 for(it=begin()...在遍历 std::map 包含 unique_ptr 时不会

for-each loop generates error but for(it=begin()... doesn't when iterating through std::map containg unique_ptr

本文关键字:map std 遍历 包含 unique ptr 错误 循环 begin it for      更新时间:2023-10-16

当我在std::map上使用for-each样式的循环时,但当我使用iterator-incrementing for-loop时,我得到了一个奇怪的错误。为什么会这样?

这不会产生任何错误:

  for(auto it = SubjectList.begin(); it!= SubjectList.end(); ++it){
    Hist2D<int> h2d(25,25);
  }

然而,这会产生一个错误:

      for(auto subject: SubjectList){
        Hist2D<int> h2d(25,25);
      }

如下:

ctest.cpp:406:23: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<ListOfNumericLists<int> >]’
     for(auto subject: SubjectList){
                       ^
In file included from /usr/include/c++/4.9/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.9/memory:62,
                 from ctest.cpp:1:
/usr/include/c++/4.9/bits/stl_pair.h:127:17: note: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<ListOfNumericLists<int> >]’ is implicitly deleted because the default definition would be ill-formed:
       constexpr pair(const pair&) = default;

这是std::map 的声明

std::map<std::string, std::unique_ptr<ListOfNumericLists<int>>> SubjectList;

错误是您的映射对不可复制,您需要迭代引用

for(auto& subject: SubjectList)

或者,如果你不打算突变这些元素,你应该让它们成为const

for(auto const& subject: SubjectList)

这是因为std::map的每个元素都是

std::pair<std::string, std::unique_ptr<ListOfNumericLists<int>>

因此,由于存在std::unique_ptr,元素是不可复制的

for(auto subject: SubjectList)

创建映射中每个键/值对的名为subject的副本。由于您的值类型是无法复制的std::unique_ptr,因此也无法复制该对。因此出现了错误。

尝试

for(const auto &subject: SubjectList)

相反。

顺便说一句,迭代器循环当然工作得很好,因为您甚至没有访问,更不用说尝试复制那里的映射内容了。

相关文章: