【问题标题】:Error in nested c++11 for loop: binding lvalue reference to rvalue [duplicate]嵌套c ++ 11 for循环中的错误:将左值引用绑定到右值[重复]
【发布时间】:2017-11-04 19:52:16
【问题描述】:

当我尝试编译包含此片段的代码时:

vector<vector<bool>> p(n);
for(vector<bool>& i : p) {
    i = vector<bool>(m);
}

for(vector<bool>& i : p) {
        for(bool& j : i) {
            int a = round(rand() / double(RAND_MAX));
            if(a) j = true;
            else j = false;
        }
}

发生错误,指出 j 是一个右值,因此我无法将左值引用绑定到它。为什么是右值?如果我没看错的话,它不是一个表达式,而是存在于向量 i 的内存元素中。更重要的是,当我只使用一个循环时它工作得很好。

我知道我可以轻松地将其替换为普通的 for 循环,但我想了解为什么这是错误的,并了解当我想更改值时是否可以使用嵌套的 c++11 for 循环。

【问题讨论】:

  • 第一个循环的目的是什么?为什么不干脆做vector&lt;vector&lt;bool&gt;&gt; p(n, vector&lt;bool&gt;(m));?我建议this std::vector reference,尤其是the constructor reference(参见重载2)。
  • 至于你的问题,用auto代替类型推断。

标签: c++11 for-loop nested-loops rvalue


【解决方案1】:

std::vector&lt;bool&gt; 不是bool 实例的向量。请参阅the cppreference page 了解说明。

这里的问题是bool&amp; j : i 试图通过bool&amp; 获取i 的每个元素。但i 实际上并不包含布尔值 - 它会返回某种行为类似的 proxy 对象。


这个最小的例子重现了这个问题:

std::vector<bool> i;
for(bool& j : i) { }  

on godbolt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2014-10-31
    • 2011-02-14
    • 1970-01-01
    • 2017-04-13
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多