对指针和常量兼容性的引用

Posted

技术标签:

【中文标题】对指针和常量兼容性的引用【英文标题】:references to pointers and constness compatibility 【发布时间】:2019-01-23 06:35:42 【问题描述】:

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

void Swap(const int *&Pointer1, const int *&Pointer2)

    const int *Tmp = Pointer2;
    Pointer2 = Pointer1;
    Pointer1 = Tmp;

我对这段代码以及在这种情况下***/低级常量如何工作有一些疑问,有 3 个或更多“级别”。

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

【问题讨论】:

知道 const 关键字应用于左边的东西可能会有所帮助,除非左边没有任何东西,在这种情况下它将应用于右边的东西,在你的例子中它适用于 int 而不是 int*。见:duramecho.com/ComputerInformation/WhyHowCppConst.html 为了交换int *const int *,你需要两个独立的函数或一个模板,因为int *reference和一个reference i> 到const int * 不相关,即使int * 可以转换为const int * 假设您能够将int* 转换为const int*&。然后你可以int* p; const int*& y = p; const int x = 0; y = &x; *p = 1; 并修改一个 const 对象。 您可以使用this site 检查指针和常量的复杂组合的正确语法。 【参考方案1】:

    如果你想让Pointer也成为const,那么它就是int const * const & Pointer,让我们从右到左阅读;所以Pointer 是对const 的引用,指向const int。 (注意这意味着Pointer 本身和Pointer 指向的int 都不能更改。这可能与Swap 的意图相冲突。)并且const 的两个部分都不会被忽略当通过引用传递。与按值传递不同,引用不能是*** const 限定的,并且它所引用的内容的 constness 限定是保留的。

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

【讨论】:

“你想要的是 int const * const & Pointer” - 绝对不是,因为“否则我将无法交换指针” @VTT “让我们假设代码不会触及指针值(它们包含的地址)”,我的意思是 OP 说的这句话。【参考方案2】:
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;

【讨论】:

这如何回答任何问题?

以上是关于对指针和常量兼容性的引用的主要内容,如果未能解决你的问题,请参考以下文章

c#指针

指针和引用与及指针常量和常量指针

C基础指针的使用

C基础指针的使用

父子间兼容性

C++ - 返回指针或常量引用