根据C++ Core Guidelines,我应该使用 gsl::span 来传递半开序列。
我认为这意味着不要编写如下函数:
void func(const std::vector<int>& data) {
for (auto v : data) std::cout << v << " ";
}
我应该更喜欢:
void func(gsl::span<const int> data) {
for (auto v : data) std::cout << v << " ";
}
这样做的好处是它不假设调用者将他们的数据放在 a 中vector
,或者强制他们构造一个临时的vector
. 例如,他们可以通过一个std::array
。
但是一个常见的用例是传递一个大括号括起来的初始化列表:
func({0,1,2,3})
这适用于采用 a 的函数,std::vector
但对于采用 a 的函数,gsl::span
我收到错误消息:
错误 C2664:“void func(gsl::span)”:无法将参数 1 从“initializer-list”转换为“gsl::span”
它看起来gsl::span
有一个模板化的构造函数,旨在接受任何容器。
这只是 Microsoft GSL 实施中缺少的东西,还是有充分的理由阻止这种做法?