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

xyhw6mcr  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(109)

嗨,我试图了解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*}”的右值
我的问题如下:
1.为什么在引用的错误中,它被写为const string* 类型的右值。哪一部分是右值。右边是一个指针ptr,它是一个左值。
1.如果我们从std::string前面删除const,那么语句现在变成:std::string* &k=ptr程序工作正常,我认为这是因为现在的类型都左手侧和右手侧是相同的。这就是被引用的对象类型,在我们删除const之后,引用类型是相同的。
1.现在我尝试了一个不同的声明如下:std::string* const& = ptr;,结果也是一样的。所以我的问题是,为什么在这种情况下代码工作,但在第一种情况下(当const在前面时)它不工作?PS:我在声明中说:const std::string * &k = ptr ;k是指向const字符串的指针,而在语句std::string* const&k = ptr;k中是指向const指针。但是为什么在一种情况下它有效而在另一种情况下它无效呢?
1.现在,如果我添加change语句到const std::string* const&k = ptr;,程序再次工作。这个项目是如何为这个案子工作的。

dm7nw8vv

dm7nw8vv1#

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

  1. std::string * &k=ptr ;可以工作,因为类型匹配并且不需要转换。
  2. std::string* const& k= ptr;和#2一样工作,除了kconst的左值引用,不能修改。
  3. const std::string* const&k = ptr;可以工作,因为kconst的左值引用,它可以绑定到从std::string*转换的临时const std::string*

相关问题