gpt4 book ai didi

c++ - 基于无辜范围的 for 循环不起作用

转载 作者:行者123 更新时间:2023-12-02 22:46:20 24 4
gpt4 key购买 nike

以下内容无法编译:

#include <iostream>

int main()
{
int a{},b{},c{},d{};

for (auto& s : {a, b, c, d}) {
s = 1;
}
std::cout << a << std::endl;
return 0;
}

Try it on godbolt

编译器错误是:error: assignment of read-only reference 's'

现在,在我的实际情况中,列表由类上的成员变量组成。

现在,这不起作用,因为表达式变成 initializer_list<int>实际上复制了 a、b、c 和 d - 因此也不允许修改。

我的问题有两个:

不允许以这种方式编写基于范围的 for 循环背后是否有任何动机? 例如。也许裸括号表达式可能存在特殊情况。

修复此类循环的语法简洁方法是什么?

沿着这条线的东西将是首选:

for (auto& s : something(a, b, c, d)) {
s = 1;
}

我不认为指针间接是一个好的解决方案(即 {&a, &b, &c, &d} ) - 任何解决方案都应该在取消引用迭代器时直接给出元素引用

最佳答案

范围并不像人们想象的那么神奇。最后,必须有一个对象,编译器可以生成对成员函数或自由函数 begin()end() 的调用。

您可能能够到达的最接近的是:

#include <iostream>

int main()
{
int a{},b{},c{},d{};

for (auto s : {&a, &b, &c, &d} ) {
*s = 1;
}
std::cout << a << "\n";
return 0;
}

关于c++ - 基于无辜范围的 for 循环不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58730476/

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