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)。所以关于临时和非常量引用的规则不适用。


以上是conststring&amp;s和string&amp;s有什么区别?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>