对指针和常量兼容性的引用
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;
【讨论】:
这如何回答任何问题?以上是关于对指针和常量兼容性的引用的主要内容,如果未能解决你的问题,请参考以下文章