首页 > 解决方案 > 基于范围的for循环引用

问题描述

这个问题是出于好奇,而不是必要。我发现 C++11 的基于范围的 for 循环有用的一种方法是迭代离散对象:

#include <iostream>
#include <functional>

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;

    // handy:
    for (const int& n : {a, b, c}) {
        std::cout << n << '\n';
    }

我也希望能够使用相同的循环样式来修改非常量引用,但我相信标准不允许这样做(请参阅为什么引用数组是非法的?):

    // would be handy but not allowed:
    // for (int& n : {a, b, c}) {
    //     n = 0;
    // }

我想到了两种解决方法,但它们似乎会产生一些额外的小成本,而且它们看起来并不那么干净:

    // meh:
    for (int* n : {&a, &b, &c}) {
        *n = 0;
    }

    // meh:
    using intRef = std::reference_wrapper<int>;
    for (int& n : {intRef (a), intRef (b), intRef (c)}) {
        n = 0;
    }
}

所以问题是,有没有更清洁或更好的方法?对此可能没有答案,但我总是对人们在 stackoverflow 上的聪明想法印象深刻,所以我想我会问。

标签: c++11

解决方案


与其自己构建一个reference_wrapper你可以使用std::ref的,那就是你能得到的:

using std::ref;
for (int& n : {ref(a), ref(b), ref(c)}) {
    n = 0;
}

推荐阅读