- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
让我们看看下面这个简单的基于范围的 for 循环:
int a = 5, b = 6;
for (auto & i : {a, b})
{
std::cout << i << std::endl; // Works as expected.
i = 3; // Error!
}
gcc
提示 assignment of read-only reference 'i'
,暗示与初始化列表一起使用的基于范围的 for 循环隐式添加了 const
限定引用,完全无端。
最佳答案
在
int a = 5, b = 6;
for (auto & i : {a, b})
你有那个 {a, b}
是 std::initialiser_list
两个元素,a
和 b
,其中 a
的值和 b
被复制。现在,std::initializer_list
only provides constant iterators to its elements , 因为 initializer_list
s 是不可变的,因此您不能将值绑定(bind)到非 const
左值引用。
一种选择是改为传递指针,这将使指针本身保持不变,而不是它们指向的值:
for (auto& i : {&a, &b})
*i = 0;
另一种选择是使用 std::reference_wrapper
, 但这仍然需要调用 .get()
或显式转换 static_cast<int&>
在这种情况下:
for (auto& i : {std::ref(a), std::ref(b)})
i.get() = 0;
考虑到 std::reference_wrapper
has an implicit conversion operator to T&
,如果在其他情况下您能够自动触发隐式转换(而不是调用 .get()
),我不会感到惊讶。
另请注意 {a, b}
不是 a
中的数字范围至b
,真的只是那两个数字。因此,int a = 0, b = 10
你不会有 [0, 10]
但是列表0
紧随其后的是 10
.
如果您想拥有“适当”的范围,我建议您查看 Boost.Range .
关于c++ - 基于范围的隐式添加 `const` 限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455648/
我是一名优秀的程序员,十分优秀!