error: non-const lvalue reference w.r.t. boost::multi_array and foreach

error: non-const lvalue reference w.r.t. boost::multi_array and foreach

所以我创建了一个

boost::multi_array<Tile *, 2> map;

我想

for(auto&i:map) { i->reveal(); }

但是clang/llvm说

error: non-const lvalue reference to type 'sub_array<...>' cannot bind to a
      temporary of type 'sub_array<...>'

指向“auto&i”的“i”是罪魁祸首。

我看到其他关于类似错误的讨论,但我不确定从这里该何去何从。

N维数组的元素是(N-1)维数组视图

这就是 sub_array<...> 临时的意思。所以,你会想要:

#include <boost/multi_array.hpp>

struct Tile {
    void reveal(){}
};

int main() {
    boost::multi_array<Tile*, 2> map;

    for (auto row: map) {
        for (auto& col: row) {
            col->reveal();
        }
    }
}

Note you can also bind to an rvalue-reference (auto&&) which is perhaps better in the general case, but should not make a difference here.

如果您坚持可以“直接”进入存储后端:

for (size_t i = 0; i< map.num_elements(); ++i) {
    map.data()[i]->reveal();
}

但这会破坏抽象(在执行此操作之前,请务必了解步幅、存储顺序、基本偏移量如何组合)。