这是无法用任何至少符合c +++ 11规范的编译器(在godbolt尝试过)编译的代码:
#include <valarray>
#include <vector>
#include <iostream>
class Whatever {
public:
int sliceSum(const std::vector<int>& nums, int k) const {
std::valarray<int> data(nums.size());
for (int i = 0; i < nums.size(); ++i) {
data[i] = nums[i];
}
// Here we have St11slice_arrayIiE
std::cout << typeid(decltype(data[std::slice(0, k, 1)])).name() << std::endl;
return data[std::slice(0, k, 1)].sum();
}
};
class Matrix {
std::valarray<int> data;
int dim;
public:
Matrix(int r, int c) : data(r*c), dim(c) {}
int& operator()(int r, int c) {return data[r*dim + c];}
int trace() const {
// Here we have St5_ExprISt6_SClosISt9_ValArrayiEiE
std::cout << typeid(decltype(data[std::slice(0, dim, 1)])).name() << std::endl;
return data[std::slice(0, dim, 1)].sum();
}
};
int main()
{
Matrix m(3,3);
int n = 0;
for(int r=0; r<3; ++r)
for(int c=0; c<3; ++c)
m(r, c) = ++n;
Whatever s;
s.sliceSum({1,2,3}, 3);
m.trace();
}
Matrix
类来自https://en.cppreference.com/w/cpp/numeric/valarray/slice
,而Whatever
类属于我。
所以我不明白问题出在哪里,为什么在两种相同的情况下类型不同?
答案 0 :(得分:1)
这是因为在Matrix
情况下,data
是const
(因为方法是const
并且data
是成员),而在{ {1}}的情况Whatever
不是data
(因为在方法本身中被声明为非常量)。
如果您查看const
的{{3}},会发现它有两个std::valarray
接受切片参数,一个operator[]
和一个非{{1} }。
const
版本返回const
,它具有const
方法,std::valarray
返回sum
,没有方法。
要解决此问题,请将结果包装在non-const
中:
std::slice_array