标准容器传递const。也就是说,如果容器本身是const,它们的元素将自动成为const。例如:
const std::vector vec{3, 1, 4, 1, 5, 9, 2, 6};
ranges::fill(vec, 314); // impossible
const std::list lst{2, 7, 1, 8, 2, 8, 1, 8};
ranges::fill(lst, 272); // impossible
内置数组也传播const:
const int arr[] {1, 4, 1, 4, 2, 1, 3, 5};
ranges::fill(arr, 141); // impossible
然而,我注意到 std::span
(推测)不会传播const。 最小可重现示例:
#include <algorithm>
#include <cassert>
#include <span>
namespace ranges = std::ranges;
int main()
{
int arr[] {1, 7, 3, 2, 0, 5, 0, 8};
const std::span spn{arr};
ranges::fill(spn, 173); // this compiles
assert(ranges::count(arr, 173) == 8); // passes
}
为什么这段代码能正常工作?为什么 std::span
对待 const 的方式与标准容器不同?
s
是引用吗? - L. F.s
是一个const span的情况下允许std::span<int> t = s;
这样的操作呢?编译器在使用指针时是不允许这样的(正如其他答案告诉我们要将span与指针进行比较)。 - undefined