为什么我不能在基于范围的循环之外使用 boost::adaptor::map_values?

Why can't I use boost::adaptor::map_values outside a ranged-based loop?

我想使用 boost 的 boost::adaptor::map_values 构建一个 std::map 的所有值的向量。拿这个例子代码 (or try it at Godbolt):

#include <boost/range/adaptors.hpp>
#include <boost/range/adaptor/map.hpp>

std::vector<int> getValueVector(const std::map<int, int> & m)
{
    auto valueRange = boost::adaptors::map_values(m);
    return std::vector<int>(valueRange.begin(), valueRange.end());
}

int main() {
    std::map<int, int> my_map;
    getValueVector(my_map);
}

GCC 抱怨:

error: no match for call to '(const boost::range_detail::map_values_forwarder) (const std::map<int, int>&)'

我能找到的所有示例和所有文档都只在接受范围的语句(如基于范围的 for 循环或 boost::copy)中使用升压适配器,从不在需要像 [= 这样的迭代器对的语句中16=]的构造函数。

根据 GCC,这里的问题是 map_values 不适用于 std::map<int, int>。但是,this is literally the only example given by the docs,所以我很确定 std::map<int, int> 对于 map_values 应该没问题。

这里有什么问题吗?

P.S.: 我知道还有无数种其他方法可以根据地图的值优雅地构建向量。我想知道为什么这段代码不起作用。此外,这种方法还有一个额外的好处,即保证 RVO 而不是“可能是 NRVO”,这是我能想到的大多数其他解决方案。

我不熟悉范围,但这可能是一个答案,所以我 post 它作为答案。

在顶部they write:

Syntax      Code

Pipe        rng | boost::adaptors::map_values
Function    boost::adaptors::values(rng) 

事实上,当我将您的代码更改为:

#include <boost/range/adaptors.hpp>
#include <boost/range/adaptor/map.hpp>
#include <iostream>

std::vector<int> getValueVector(const std::map<int, int> & m)
{
    auto valueRange = boost::adaptors::values(m);
    return std::vector<int>(valueRange.begin(), valueRange.end());
}

int main() {
    std::map<int, int> my_map{{1,2},{3,4},{5,6}};
    auto v = getValueVector(my_map);
    for (const auto& e : v) std::cout << e << " ";
}

有预期的output:

2 4 6