在下面代码的上下文中,为什么是“cout << c" legal while "c = "x"" illegal?

问题描述 投票:0回答:3

我是 C++ 新手,正在尝试学习关键字“auto”和引用的概念。我在网上看到了这个问题和答案。

以下范围合法吗?如果是,c 的类型是什么?

const string s = "Keep out!";
for (auto &c : s){ /*... */ }

答案是:

取决于 for 循环体内的代码。例如:

cout << c;  // legal.
c = 'X';    // illegal.

没有提供任何解释。有人可以解释为什么会出现这种情况吗?

c++ reference auto
3个回答
5
投票

因为字符串是常量,所以你不能修改它。 基于范围的循环使用类型

auto &
,它将有效地变为
const char &
。 这意味着您引用的是实际字符串中的字符,而不是它们的副本。


3
投票

因为

s
是一个 const 字符串,所以你不能改变它的值。在这种情况下,
c
的类型将为
const char&


0
投票

关于汽车的一些背景和参考:

通常,如果我们使用

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&

© www.soinside.com 2019 - 2024. All rights reserved.