1

我尝试编写一个简短的函数来反转一个std::map<K, V>(我知道 boost.bimap,这是为了自学),令我惊讶的是,GCC 4.4 接受的带有 -pedantic -ansi 设置的代码被拒绝为 const - SunCC 不正确(5.8,从 2005 年开始)。

因为value_typeis std::pair<const K, V>,SunCC 坚持我在传递给andK的函数的参数以及要传递给的返回值的类型中对我的类型进行 const 限定,据我所知,这可能是对的?哪个编译器符合标准?transform()for_each()std::inserter

#include <iostream>
#include <iterator>
#include <map>
#include <string>
#include <algorithm>
template<typename K, typename V>
std::pair<V, K> flip_pair(const std::pair<K, V>& p) // GCC/MSVC
//std::pair<const V, K> flip_pair(const std::pair<const K, V>& p) // SunCC
{
     return std::make_pair(p.second, p.first); // GCC/MSVC
//     return std::pair<const V, K>(p.second, p.first); // SunCC
}
template<typename K, typename V>
std::multimap<V, K> invert_map(const std::map<K, V>& in)
{
     std::multimap<V, K> out;
     transform(in.begin(), in.end(), std::inserter(out, out.begin()),
               flip_pair<K, V>);
     return out;
}
void print_pair(const std::pair<int, std::string>& p) // GCC/MSVC
//void print_pair(const std::pair<const int, std::string>& p) // SunCC
{
        std::cout << p.first << '\t' << p.second << '\n';
}
int main()
{
     std::map<std::string, int> map;
     map["foo"] = 1; map["bar"] = 2; map["baz"] = 3;
     std::multimap<int, std::string> revmap = invert_map(map);
     for_each(revmap.begin(), revmap.end(), print_pair);
}
4

1 回答 1

3

Visual C++和g++是正确的;这段代码(带flip_pair<K, V>()a const std::pair<K, V>&)没问题。

内部transformflip_pair<K, V>正在被调用。由于传递给该函数的对象是 a pair<const K, V>,因此会创建一个类型的临时对象pair<K, V>pair具有转换构造函数,如果.firstand.second类型可转换,则允许您将一对类型转换为另一种类型)。

这个临时值被传递给flip_pair<K, V>(),利用 const 引用可以绑定到一个临时值这一事实。

于 2010-10-04T17:48:09.280 回答