【问题标题】:How does this const reference for std::pair work?std::pair 的这个 const 参考是如何工作的?
【发布时间】:2019-03-11 12:40:18
【问题描述】:

考虑 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&lt;const key_type, T&gt; 类型的对象可以通过const std::pair&lt;key_type, T&gt; 类型的引用来引用。这在逻辑上是可取的(因为std::pairconstness 暗示了firstsecond 成员的constness,这与std::pair&lt;const key_type, T&gt; 兼容)。

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

【问题讨论】:

    标签: c++ stl constants std-pair


    【解决方案1】:

    当你这样做时

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2014-08-31
    • 1970-01-01
    • 2017-11-16
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多