我一直在处理一个使用了大量双指针的项目,但发现其中存在一些错误。经过一番深入挖掘,我意识到问题出在将非const对象通过指向const对象的引用指针传递时,它最终以复制的方式传递,而不是引用传递。我不理解为什么会这样,因为引用只是别名,const部分应该只会在尝试在该范围内更改对象时导致错误。更加令人困惑的是,当通过指向const对象的双指针或仅是const对象的引用进行传递时,不会发生这种情况。有谁可以解释为什么会发生这种情况,以及这种特殊情况与我提到的其他情况有何不同吗?
#include <iostream>
void PassByConstPtrRef(int const *const &num_ptr_ref)
{
std::cout << &num_ptr_ref << std::endl;
}
void PassByPtrRef(int *const &num_ptr_ref)
{
std::cout << &num_ptr_ref << std::endl;
}
void PassByPtrPtr(int const *const *const num_ptr_ref)
{
std::cout << num_ptr_ref << std::endl;
}
void PassByConstRef(int const &num)
{
std::cout << &num << std::endl;
}
int main()
{
int *num_ptr = new int{ 10 };
int *const *num_ptr_ptr = &num_ptr;
int *const &num_ptr_ref = *num_ptr_ptr;
std::cout << num_ptr_ptr << " : " << &num_ptr_ref << std::endl; // is equal
std::cout << num_ptr_ptr << " : ";
PassByConstPtrRef(num_ptr_ref); // is not equal
std::cout << num_ptr_ptr << " : ";
PassByPtrRef(num_ptr_ref); // is equal
std::cout << num_ptr_ptr << " : ";
PassByPtrPtr(&num_ptr_ref); // is equal
int foo = 4;
int &bar = foo;
std::cout << &foo << " : ";
PassByConstRef(bar); // is equal
}
输出:
0x7ffeeb6d59c8:0x7ffeeb6d59c8
0x7ffeeb6d59c8:0x7ffeeb6d59b0
0x7ffeeb6d59c8:0x7ffeeb6d59c8
0x7ffeeb6d59c8:0x7ffeeb6d59c8
0x7ffeeb6d59ac:0x7ffeeb6d59ac