std :: pair的const引用如何工作?

问题描述 投票:2回答:1

考虑STL中的std::map类:

template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;

std::map的迭代器返回类型的对象

std::pair<const key_type, T>

这里需要注意的重要事项是该对的第一个成员是const。这意味着,以下引用分配无效。

std::pair<key_type, T>& reference = *map_iterator;        // Incorrect, key_type is not const

std::pair<const key_type, T>& reference = *map_iterator;  // Correct

但是,以下表达式是有效的:

const std::pair<key_type, T>& reference = *map_iterator;  // Correct, const reference is okay

因此,通过某种机制,std::pair<const key_type, T>类型的对象可以通过引用const std::pair<key_type, T>类型来引用。这在逻辑上是可取的(因为conststd::pairness暗示成员constfirstsecondness,这与std::pair<const key_type, T>兼容)。

但是,我很想知道C ++实现机制使这种兼容性成为可能。我确定有实现std :: pair的方法,其中上面的两个引用类型不兼容。

c++ stl const std-pair
1个回答
6
投票

当你这样做

const std::pair<key_type, T>& reference = *map_iterator;

*map_iterator返回std::pair<const key_type, T>&。然后从中复制初始化std::pair<key_type, T>,然后将reference绑定到该临时变量。因为您有对const的引用,所以这会将该临时的生命周期延长为引用的生命周期,并且您现在拥有一个元素,该元素是地图中的元素的副本。基本上你已经完成了

std::pair<key_type, T> copy = *map_iterator; 

上面的转换序列有效,因为在初始化时最多允许一个用户定义的转换,编译器会尝试这样做以给你一个有效的初始化。

© www.soinside.com 2019 - 2024. All rights reserved.