C++ cbegin函数的返回值

C++ cbegin函数的返回值,c++,iterator,C++,Iterator,我有这样的代码 #include <iostream> #include <string> int main() { std::string str{"My short string."}; for (auto& it = str.cbegin(); it != str.cend(); ++it) std::cout << *it; return 0; } #包括 #包括 int main(){ std

我有这样的代码

#include <iostream>
#include <string>

int main() {

    std::string str{"My short string."};

    for (auto& it = str.cbegin(); it != str.cend(); ++it)
        std::cout << *it;

    return 0;
}
#包括
#包括
int main(){
std::string str{“我的短字符串”。};
for(auto&it=str.cbegin();it!=str.cend();++it)
std::cout按值返回迭代器,它返回的是右值,对非常量的左值引用不能绑定到右值

我不想复制它,所以我使用&语法

复制迭代器一点也不重,所以

for (auto it = str.cbegin(); it != str.cend(); ++it)
    std::cout << *it;
for(auto-it=str.cbegin();it!=str.cend();++it)
std::cout按值返回迭代器,它返回的是右值,对非常量的左值引用不能绑定到右值

我不想复制它,所以我使用&语法

复制迭代器一点也不重,所以

for (auto it = str.cbegin(); it != str.cend(); ++it)
    std::cout << *it;
for(auto-it=str.cbegin();it!=str.cend();++it)

std::难道不能对r值进行非常量引用(返回的迭代器将是r值)吗?必须按值分配它才能使for循环按编写的方式工作。为什么不复制迭代器?这里可能有一些误解。答案已经详细解释了,但迭代器已经是一个轻量级间接寻址,你不必害怕抄袭it@KonradRudolph,我知道迭代器是轻量级的,但面对这个问题,我的好奇心让我提出了这个问题。你不能有一个对r值的非常量引用,返回的迭代器将是r值。你必须通过值来分配它,你的for循环才能像写的那样工作。你为什么不想复制它呢迭代器?这里可能有一些误解。答案已经详细解释了,但是迭代器已经是一个轻量级的间接方法,你不必害怕复制it@KonradRudolph,我知道迭代器是轻量级的,但面对这个问题,我的好奇心让我提出了这个问题我还没有收集到有关standart库的所有信息,我不知道&&语法以及它是如何工作的。我认为它像cbegin(){/*pa-pa-pa*/return iterator;}一样工作,并认为我可以对它进行引用。谢谢!@user2923317 use
auto&&
总是正确的(我的意思是它将始终通过编译)。因为它是一个“转发引用”(又称通用引用),请参见引用折叠。但我认为在这里使用
auto
就足够了。或者更好的是,
for(auto c:str)std::我不能感谢你的anser,我还没有收集到关于standart库的所有信息,我不知道&&语法以及它是如何工作的。我认为它像cbegin(){/*pa-pa-pa*/return iterator;}一样工作,并且认为我可以对它进行引用。谢谢!@user2923317 use
auto&
总是正确的(我的意思是它将始终通过编译)。因为它是一个“转发引用”(又称通用引用),请参阅引用崩溃。但我认为在这里使用
auto
就足够了。或者更好的是,
for(auto c:str)std::cout