指针和常量兼容性的引用

时间:2018-08-16 10:17:52

标签: c++ pointers reference const pass-by-reference

出于学习目的,我编写了以下代码:

void Swap(const int *&Pointer1, const int *&Pointer2)
{
    const int *Tmp = Pointer2;
    Pointer2 = Pointer1;
    Pointer1 = Tmp;
}

我对这段代码以及具有3个或更多“级别”的这种情况下的顶层/底层常量工作原理有疑问。

  1. 很明显,我的引用不能为const,否则我将无法交换指针。但是,让我们假设代码不会触及指针值(它们包含的地址):正确的语法应该是const int *(const&Pointer)或int * const&Pointer?我觉得后者的意思是“指向const int的const指针的引用,但我不确定。如果是这种情况,则const部分将被编译器忽略,就像更简单的const int按值传递一样还是不会因为引用而已?
  2. 尝试使用指向int的指针调用此函数失败。但是,可以将一个int地址分配给指向const int的指针,并且如果我只是删除引用,的确不会出错。这使我认为这些引用“强制”每个const完全匹配。这是真的?如果是这样,有办法解决吗?

2 个答案:

答案 0 :(得分:4)

  1. 如果您也想将Pointer设为const,那么它也将是int const * const & Pointer,让我们从右到左阅读它;因此Pointer是指向const const的{​​{1}}指针的引用。 (请注意,int本身和Pointer指向的int都不能更改。这可能会与Pointer的意图产生冲突。)而且两个{ {1}}部分在通过引用传递时不会被忽略。与按值传递不同,引用不能是顶级Swap限定的,并且保留引用所限定的常量。

  2. 您不能将const传递给采用const的函数(即,对非const指针的左值引用)。 int *可以隐式转换为const int *&,但是转换后的int *是临时的,不能绑定到非常量左值引用。临时可以绑定到const的左值引用(或右值引用),因此如#1中所述将参数类型更改为const int*,传递const int*就可以了。

答案 1 :(得分:-1)

template <class P1,class P2>
void Swap(P1 && Pointer1, P2 && Pointer2)
{/*...*/}

int main()
{
    const int a =1, b = 2;
    Swap(&a, &b); // &a and &b - r-value, Pointer1 and Pointer2 param this 'const int* &&'
    const int * const a_cref_p = &a;
    const int * const b_cref_p = &b;
    Swap(a_cref_p,b_cref_p); // a_cref_p and b_cref_p - l-value, Pointer1 and Pointer2 param this 'const int* const &'
    const int * a_ref_p = &a;
    const int * b_ref_p = &b;
    Swap(a_ref_p,b_ref_p); // a_ref_p and b_ref_p - l-value, Pointer1 and Pointer2 param this 'const int* &'
    return 0;
}