以下是基于C++范围的循环的示例,该循环按值捕获元素
vector<int> v = {1, 3, 5, 7, 9};
for (auto x : v)
cout << x << ' ';
Run Code Online (Sandbox Code Playgroud)
为什么甚至允许按价值捕获?这只是令人困惑和容易出错.如果弄错了,你会花很多钱.我无法想象任何无法通过显式创建副本而不是为您执行循环而无法解决的问题.有什么具体原因吗?我在这里错过了什么吗?
编辑
是的我知道函数允许传递值,但这对它有明显的好处.我要问的是,在for循环中是否有任何使用按值捕获的用法.我现在可以看到,这可以是bools和chars的有用序列.
我们可以按值传递参数的原因完全相同 - 如果需要副本,请按值获取.
我无法想象任何无法通过显式创建副本而不是为您执行循环而无法解决的问题.
我认为这是你遇到的主要问题.循环不是"为你做".这是明确要求复制.什么比初始化非参考变量更明确?
这实际上只是一个普通的声明.为什么,当它在其他地方都有效时,我们auto在这里自己会变得无效吗?实际上,该声明的初始化由标准定义为:
auto x = *__begin;
Run Code Online (Sandbox Code Playgroud)
where __begin表达式给迭代器赋予范围的第一个元素(在本例中v.begin()).这与C++中的任何其他复制没有什么不同.你会认为以下是一个常见的错误吗?
int x = some_other_int;
Run Code Online (Sandbox Code Playgroud)
要么:
std::string str = some_other_string;
Run Code Online (Sandbox Code Playgroud)
不,当我们想要一份副本时,我们会写一个这样的声明.
这是一个用例示例:
void modify_argument(X&);
void use(X);
// ...
std::vector<X> v = /* ... */;
for (auto x : v) {
// We want to modify the copy of x, but not the original:
modify_argument(x);
use(x);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |