gpt4 book ai didi

c++ - 在 C++11 中,引用在运行时明显发生变化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:41 25 4
gpt4 key购买 nike

考虑以下 C++11 中的简单代码,摘自 C++ Primer, 5th Edition :

#include <iostream>
#include <string>

using std::cout;
using std::string;
using std::endl;

int main()
{
string s("Hello World!!!");
for (auto &c : s) // for every char in s (note: c is a reference)
c = toupper(c); // c is a reference, so the assignment changes the char
cout << s << endl;
return 0;
}

该代码使用 range for 循环遍历 string 中的每个字符并将其更改为大写,这非常简单。令我困惑的是,引用 c 似乎在运行时发生了变化。在书中的其他地方,作者提到引用不是对象,不能在运行时更改。谁能阐明编译器究竟是如何解释这段代码的?

最佳答案

您说得对,不能更改引用以引用不同的对象;它必须被初始化以引用一个特定的对象,并且在它的整个生命周期中保持该对象的别名。

在这种情况下,引用不会改变;相反,为循环的每次迭代创建和销毁一个新引用。此范围式循环被定义为(或多或少)等同于旧式循环

for (auto it = s.begin(); it != s.end(); ++it) {
auto &c = *it;
// loop body
}

这样写,很明显每次都有一个新的引用,而不是(以某种方式)更新的单个引用。

关于c++ - 在 C++11 中,引用在运行时明显发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25849287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com