出于学习目的,我编写了以下代码:
void Swap(const int *&Pointer1, const int *&Pointer2)
{
const int *Tmp = Pointer2;
Pointer2 = Pointer1;
Pointer1 = Tmp;
}
我对这段代码以及具有3个或更多“级别”的这种情况下的顶层/底层常量工作原理有疑问。
答案 0 :(得分:4)
如果您也想将Pointer
设为const
,那么它也将是int const * const & Pointer
,让我们从右到左阅读它;因此Pointer
是指向const
const
的{{1}}指针的引用。 (请注意,int
本身和Pointer
指向的int
都不能更改。这可能会与Pointer
的意图产生冲突。)而且两个{ {1}}部分在通过引用传递时不会被忽略。与按值传递不同,引用不能是顶级Swap
限定的,并且保留引用所限定的常量。
您不能将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;
}