对指针和constness兼容性的引用

And*_*cco 5 c++ pointers const reference pass-by-reference

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

void Swap(const int *&Pointer1, const int *&Pointer2)
{
    const int *Tmp = Pointer2;
    Pointer2 = Pointer1;
    Pointer1 = Tmp;
}
Run Code Online (Sandbox Code Playgroud)

我对这段代码有一些疑问,以及在这种情况下顶级/低级constness如何工作,有3个或更多"级别".

  1. 显然我的引用不能是const,否则我将无法交换指针.但是假设代码不会触及指针值(它们包含的地址):正确的语法是const int*(const&Pointer)还是int*const&Pointer?我觉得后者的意思是"引用一个指向const int的const指针,但我不确定.如果是这样的话,编译器将忽略const部分,就像一个更简单的const int传递值或者不会,因为它是在参考?
  2. 尝试使用指向int的指针调用此函数失败.但是,可以为指向const int的指针分配一个int地址,如果我只删除引用,我确实没有错误.这让我觉得那些引用"强制"每个const完全匹配.这是真的?如果是这样,有一些方法吗?

son*_*yao 4

  1. 如果你也想Pointer这样const,那就是int const * const & Pointer,让我们从右到左读;so是对指向 的指针Pointer的引用。(请注意,这意味着它本身和所指向的都不能更改。这可能会与 的意图相冲突。)并且在按引用传递时,这两个部分都不会被忽略。与按值传递不同,引用不能是顶级限定的,并且保留其所引用内容的常量限定。constconst intPointerintPointerSwapconstconst

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