【发布时间】:2021-08-03 19:03:02
【问题描述】:
您好,我正在尝试了解引用和指针在 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 左值引用绑定到 'const string* {aka const std:: 类型的右值__cxx11::basic_string}'
我的问题如下:
- 为什么在引用的错误中写成 const string* 类型的右值。哪一部分是这里的右值。右手边是一个指针
ptr,它是一个左值。 - 如果我们从 std::string 的前面删除 const,则语句现在变为:
std::string* &k=ptr程序运行良好,我认为这是因为现在左侧和右侧的类型相同。也就是被引用的对象类型,去掉const后引用类型是一样的。 - 现在我尝试了如下不同的语句:
std::string* const& = ptr;,结果证明这也有效。所以我的问题是为什么在这种情况下代码有效但在第一种情况下(当 const 在前面时)它不起作用? PS:我在语句中知道:const std::string * &k = ptr ;k是对指向 const 字符串的指针的引用,而在语句中std::string* const&k = ptr;k是对 const 指针的引用。但为什么在一种情况下它有效,而在另一种情况下却无效? - 现在,如果我将语句更改为
const std::string* const&k = ptr;,程序将再次运行。该程序如何处理这种情况。
【问题讨论】:
-
要了解为什么第一种情况不能被允许,请考虑
int x = 0; int* p = &x; const int*& pr = p; const int y = 1; pr = &y; *p = 123;,它将分配给常量对象y。
标签: c++ string c++11 pointers reference