c++ 为什么我可以有一个常量对〈const T,T>引用一个对〈T,T>?

ttcibm8c  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(197)

我偶然发现我可以有一个const std::pair<const int, int>&std::pair<int,int>的引用:

#include <utility>
int main()
{
    std::pair<int, int> p{1,2};
    const std::pair<const int, int>& ref_ok{p}; // why does this work?
    std::pair<const int, int>& ref_invalid{p}; // then why does this not work?
}

考虑到const std::pair<const int, int>std::pair<int, int>是不同的类型,没有继承关系,为什么这是可能的?

3yhwsihp

3yhwsihp1#

const std::pair<const int, int>& ref_ok{p};实际上是物化被初始化为与p相同的值的临时std::pair<const int, int>,并且引用初始化是将临时的生存期延长到引用的生存期。
不允许使用std::pair<const int, int>& ref_invalid{p};,因为非const引用无法绑定到临时。
下面的代码示例演示ref_ok实际上不是对p的引用。对p的更改不会影响ref_ok

#include <iostream>
#include <utility>

int main()
{
    std::pair<int,int> p{1,2};
    const std::pair<const int, int>& ref_ok{p}; // why does this work?

    std::cout << p.first << ' ' << ref_ok.first << '\n';

    p.first = 5;

    std::cout << p.first << ' ' << ref_ok.first << '\n';
}

输出:
示例:https://godbolt.org/z/8bfM7fYbx

相关问题