我一直在尝试在以前使用const std::vector<T>&
的地方开始使用std::span<const T>
。我唯一的症结如下所示:
#include <iostream>
#include <vector>
#include <span>
#include <numeric>
double mean1(std::span<const double> vals) {
return std::accumulate(vals.begin(), vals.end(), 0.0) / vals.size();
}
double mean2(const std::vector<double>& vals) {
return std::accumulate(vals.begin(), vals.end(), 0.0) / vals.size();
}
int main() {
std::vector<double> foo = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
auto v = mean1(foo);
std::cout << v << "n";
v = mean2( { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 } );
std::cout << v << "n";
v = mean1({ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 } ); // << this is an error
std::cout << v << "n";
}
我知道传递std:vector{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }
是可行的,但这相当冗长。initializer_list
更为冗长。只是想知道我是否遗漏了一些显而易见的东西。
Visual Studio的特定错误是
C2664‘double mean1(std::span<const double,18446744073709551615>(’:无法将参数1从"initializer list"转换为"std::span<const双人间,18446744073709551615>'
我认为,基本上,std::span
没有接受初始值设定项列表的构造函数。
您可以使用
mean1( {{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }} );
其调用原始数组构造函数。
如果你想指定类型,我建议
mean1( std::initializer_list{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 } )
这防止了另一个容器的潜在构造。(无论如何仍然构建initializer_list
(