嗨,我试图了解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;
,程序再次工作。这个项目是如何为这个案子工作的。
1条答案
按热度按时间dm7nw8vv1#
1.如您所见,给定
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
的左值引用,它可以绑定到从std::string*
转换的临时const std::string*
。