基于无辜范围的循环无效

dar*_*une 12 c++ for-loop initializer-list c++17

以下内容无法编译:

#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;
}
Run Code Online (Sandbox Code Playgroud)

在Godbolt上尝试

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

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

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

我的问题有两个:

不允许以这种方式编写基于范围的for循环背后有动机吗? 例如。也许会有一些特殊的情况来表达裸括号。

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

最好遵循以下方式:

for (auto& s : something(a, b, c, d)) {
    s = 1;
}
Run Code Online (Sandbox Code Playgroud)

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

mhh*_*mon 4

范围并不像人们想象的那么神奇。最后,必须有一个对象,编译器可以生成对成员函数或自由函数的调用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;
}
Run Code Online (Sandbox Code Playgroud)