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

Error when Initialising a reference to a pointer to const string with pointer to a non-const string

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

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

编译此程序时出现错误:

error: cannot bind non-const lvalue reference of type ‘const string*& {aka const std::__cxx11::basic_string&}’ to an rvalue of type ‘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 是对 a 的引用常量指针。但为什么在一种情况下有效而在另一种情况下却无效?
  4. 现在,如果我将语句更改为 const std::string* const&k = ptr;,程序将再次运行。该程序如何处理这种情况。
  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 的左值引用,它可以绑定到从 [=11= 转换而来的临时 const std::string* ]. (顺便说一句,右值引用也有效。例如 const std::string* &&k = ptr;