conststring&s和string&s有什么区别?
这是来自c++ 入门的代码:
string::size_type findChar(const string &s, char c, string::size_type & occurs){
auto ret = s.size();
occurs = 0;
for (decltype(ret) i = 0; i != s.size(); ++i){
if (s[i] == c){
if (ret == s.size())
ret = i;
occurs++;
}
}
return ret;
}
int main () {
string::size_type ctr;
cout << findChar("hello, world!", 'o', ctr);
}
const从 中删除后发生错误const string &s。
错误:无法将类型为 'std::__cxx11::string&' {aka 'std::__cxx11::basic_string&'} 的非常量左值引用绑定到类型为 'std::__cxx11::string' {aka 'std 的右值::__cxx11::basic_string'} cout << findChar("hello, world!", 'o', ctr);
我想知道,在这种情况下,const关键字会改变编译器的哪些行为?谢谢你帮助我。
回答
像这样的字符串文字"hello, world!"不是std::string. 所以要调用你的函数,编译器必须std::string为你创建一个。这样的对象称为临时对象。因此,在第一种情况下,编译器用于"hello, world!"创建 astd::string然后将该临时字符串绑定到引用 parameter s。
但是 C++ 有一条规则,您不能将临时引用绑定到非常量引用。但是当您s从更改为 时const std::string&,std::string&您是在要求编译器完全这样做。这就是错误消息告诉您的内容。
如果您将代码更改为此
string::size_type ctr;
string hello = "hello, world!";
cout << findChar(hello, 'o', ctr);
即使没有const,它现在也可以编译。这里的区别在于编译器不再创建临时文件std::string(因为hello已经是一个std::string)。所以关于临时和非常量引用的规则不适用。