【发布时间】:2016-02-25 18:42:25
【问题描述】:
根据C++ Core Guidelines,我应该use a gsl::span to pass a half-open sequence。
我认为这意味着不要编写如下函数:
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 << " ";
}
它的好处是它不会假设调用者将他们的数据放在vector 中,或者强制他们构造一个临时的vector。例如,他们可以传递std::array。
但一个常见的用例是传递一个用大括号括起来的初始化列表:
func({0,1,2,3})
这适用于采用 std::vector 的函数,但对于采用 gsl::span 的函数,我收到错误消息:
错误 C2664: 'void func(gsl::span)' : 无法转换 参数 1 从 'initializer-list' 到 'gsl::span'
它看起来像 gsl::span has a templated constructor 设计用于容纳任何容器。
这只是 Microsoft GSL 实施中缺少的东西,还是有充分的理由阻止这种做法?
【问题讨论】:
-
花括号列表不是容器。
-
@KerrekSB
std::initializer_list是一个容器吗? -
不,不是。这是一种表示初始化程序列表的语言支持类型...但即使是这样,那也无济于事,因为您的参数不是
std::initializer_list<int>类型。这只是一个花括号列表。 -
@KerrekSB 好的,然后提到使用容器的模板化构造函数有点让人分心。但我的问题仍然存在。
-
嗯,答案是
gsl::span没有提供合适的构造函数...
标签: c++ c++11 cpp-core-guidelines