我是 C++ 新手,正在尝试学习关键字“auto”和引用的概念。我在网上看到了这个问题和答案。
以下范围合法吗?如果是,c 的类型是什么?
const string s = "Keep out!";
for (auto &c : s){ /*... */ }
答案是:
取决于 for 循环体内的代码。例如:
cout << c; // legal.
c = 'X'; // illegal.
没有提供任何解释。有人可以解释为什么会出现这种情况吗?
因为字符串是常量,所以你不能修改它。 基于范围的循环使用类型
auto &
,它将有效地变为 const char &
。 这意味着您引用的是实际字符串中的字符,而不是它们的副本。
因为
s
是一个 const 字符串,所以你不能改变它的值。在这种情况下,c
的类型将为const char&
。
关于汽车的一些背景和参考:
通常,如果我们使用
auto
来定义带有 const
字符初始值设定项的变量,由于 const
是顶级 const,auto
将忽略该 const。
const int ci = 0;
auto a = ci; // a is an int
但是,如果我们使用
auto
来定义引用,那么顶层 const 就不会被忽略
const int ci = 0;
auto &a = ci; // a is a const int&
回到问题:
由于
s
是一个 const
字符串,因此我们从 s
获取的元素将是 const
字符。我们通过auto &c
来定义c,即使用auto来定义引用。最后,我们会得到一个const int&
。