在 C++ 中自动引用地址

auto reference to address in C++

我正在研究一些 C++ 功能,尝试进行一些实验。但是,我卡在了编译错误的地方:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str = "some string";
    auto &c = str.begin(); // compile error
    *c = toupper(*c);
    cout << *c << ", str: " << str << endl;
}

我不确定为什么不能接受。我的想法是 c 的类型是 char *(指向 char 的指针),所以这就是我写成上面的原因。但是为什么编译失败呢?

Error C2440 Cannot transform 'std::_String_iteratorstd::_String_val<std::_Simple_types<_Elem>>' to'std::_String_iterator<std::_String_val<std::_Simple_types<_Elem

PS: 另一种我先试过的方法也可以

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str = "some string";
    auto &c = *str.begin(); // success
    c = toupper(c);
    cout << c << ", str: " << str << endl;
}

begin() returns 迭代器 按值 ,不是引用。不允许形成非 const 左值引用。

使其成为 const 将延长返回迭代器的生命周期,然后程序将编译:

const auto &c = str.begin();

另一方面,迭代器的复制成本应该很低,并且来自连续容器的迭代器通常实现为纯指针。惯用的方法是:

auto c = str.begin();

在您的第二个示例中,形成对第一个元素的引用的惯用方法是:

auto& c = str.front();