gpt4 book ai didi

c++ - const string &s 和 string &s 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 16:25:30 35 4
gpt4 key购买 nike

这是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 string &s 中删除 const 后发生错误。

error: cannot bind non-const lvalue reference of type 'std::__cxx11::string&' {aka 'std::__cxx11::basic_string&'} to an rvalue of type 'std::__cxx11::string' {aka 'std::__cxx11::basic_string'}cout << findChar("hello, world!", 'o', ctr);

我想知道,在这种情况下,const 关键字会改变编译器的哪些行为?谢谢你帮助我。

最佳答案

"hello, world!" 这样的字符串文字不是 std::string。因此,要调用您的函数,编译器必须为您创建一个 std::string。这样的对象称为临时对象。所以在第一种情况下,编译器使用 "hello, world!" 创建一个 std::string 然后 binds 临时字符串来引用参数s.

但是,C++ 有一个规则,您不能将临时对象绑定(bind)到非常量引用。但是,当您将 sconst std::string& 更改为 std::string& 时,您是在要求编译器完全这样做。这就是错误消息告诉您的内容。

如果您将代码更改为此

string::size_type ctr;
string hello = "hello, world!";
cout << findChar(hello, 'o', ctr);

现在即使没有 const 也可以编译。这里的区别在于编译器不再创建一个临时的 std::string(因为 hello 已经是一个 std::string)。所以关于临时和非常量引用的规则不适用。

关于c++ - const string &s 和 string &s 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65273582/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com