【问题标题】: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 个或更多“级别”。

  1. 显然我的引用不能是 const,否则我将无法交换指针。然而,让我们假设代码不会触及指针值(它们包含的地址):正确的语法是 const int *(const &Pointer) 还是 int * const &Pointer?我感觉后者的意思是“引用指向 const int 的 const 指针,但我不确定。如果是这种情况,编译器将忽略 const 部分,就像更简单的 const int 按值传递一样还是不会因为它在参考之下?
  2. 尝试使用指向 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 检查指针和常量的复杂组合的正确语法。

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


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

  2. 您不能将 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;
}

【讨论】:

  • 这如何回答任何问题?
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
相关资源
最近更新 更多