用指向非常量字符串的指针初始化对常量字符串的指针的引用时出错

问题描述 投票:0回答:1

嗨,我正在尝试了解引用和指针在 C++ 中的工作原理,因此尝试了不同的示例,其中一个示例我无法理解为什么会产生错误:

int main()
{
     cout << "Hello World" << endl; 
     std::string s="hg";
     std::string *ptr=&s; 
     const std::string * &k=ptr ;
     return 0;
}

编译此程序时,我收到错误:

错误:无法将“const string*& {aka const std::__cxx11::basic_string&}”类型的非常量左值引用绑定到“const string* {aka const std::__cxx11::basic_string”类型的右值}'

我的问题如下:

  1. 为什么在引用的错误中写的是 const string* 类型的右值。这里哪一部分是右值。右侧是一个指针
    ptr
    ,它是一个左值。
  2. 如果我们从 std::string 前面删除 const ,则语句现在变为:
    std::string* &k=ptr
    程序工作正常,我认为是因为现在左侧和右侧的类型相同。这就是引用的对象类型,去掉const后引用类型是一样的。
  3. 现在我尝试了以下不同的说法:
    std::string* const& = ptr;
    ,事实证明这也有效。所以我的问题是为什么在这种情况下代码可以工作但在第一种情况下(当 const 位于前面时)它不起作用? PS:我在语句中知道:
     const std::string * &k = ptr ;
    k
    是对 const 字符串的指针的引用,而在语句
    std::string* const&k = ptr;
    k
    中是对 const 指针的引用。但为什么在一种情况下有效,而在另一种情况下则无效?
  4. 现在,如果我将语句更改为
    const std::string* const&k = ptr;
    ,程序将再次运行。该程序在本例中效果如何。
c++ string c++11 pointers reference
1个回答
1
投票
  1. 鉴于

    const std::string * &k=ptr ;
    ,正如您所见,这里的类型不匹配。您正在尝试将
    std::string*
    绑定到对
    const std::string*
    的引用。引用不能直接绑定到不同类型的对象,
    std::string*
    需要转换为
    const std::string*
    ,这是一个临时的,即右值,然后你会得到右值不能绑定到左值引用的错误。

  2. std::string * &k=ptr ;
    之所以有效,是因为类型匹配并且不需要转换。

  3. std::string* const& k= ptr;
    与#2 一样,除了
    k
    是对
    const
    的左值引用,无法修改。

  4. const std::string* const&k = ptr;
    之所以有效,是因为
    k
    是对
    const
    的左值引用,它可以绑定到从
    const std::string*
    转换而来的临时
    std::string*

© www.soinside.com 2019 - 2024. All rights reserved.