首页 > 解决方案 > 基于 for 循环的无辜范围不起作用

问题描述

以下不编译

#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;
}

在godbolt上试试

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

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

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

我的问题有两个:

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

修复这种循环的语法简洁方法是什么?

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

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

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

标签: c++for-loopc++17initializer-list

解决方案


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

推荐阅读