嗨,我正在尝试了解引用和指针在 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”类型的右值}'
我的问题如下:
ptr
,它是一个左值。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;
,程序将再次运行。该程序在本例中效果如何。鉴于
const std::string * &k=ptr ;
,正如您所见,这里的类型不匹配。您正在尝试将 std::string*
绑定到对 const std::string*
的引用。引用不能直接绑定到不同类型的对象,std::string*
需要转换为const std::string*
,这是一个临时的,即右值,然后你会得到右值不能绑定到左值引用的错误。
std::string * &k=ptr ;
之所以有效,是因为类型匹配并且不需要转换。
std::string* const& k= ptr;
与#2 一样,除了 k
是对 const
的左值引用,无法修改。
const std::string* const&k = ptr;
之所以有效,是因为 k
是对 const
的左值引用,它可以绑定到从 const std::string*
转换而来的临时 std::string*
。