在 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();
我正在研究一些 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();