C++ 在“std::slice_数组中没有名为“sum”的成员

C++ 在“std::slice_数组中没有名为“sum”的成员,c++,c++11,C++,C++11,下面是一段代码,至少在godbolt上试用过的符合c++11标准的编译器都无法编译: #include <valarray> #include <vector> #include <iostream> class Whatever { public: int sliceSum(const std::vector<int>& nums, int k) const { std::valarray<int>

下面是一段代码,至少在godbolt上试用过的符合c++11标准的编译器都无法编译:

#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();
}
类矩阵取自https://en.cppreference.com/w/cpp/numeric/valarray/slice 我的一切都归我

所以我不明白问题是什么,为什么在两种相同的情况下类型是不同的。

这是因为在矩阵中,数据是常量,因为方法是常量,数据是成员,而在任何情况下,数据都不是常量,因为它在方法本身中声明为非常量

如果查看for std::valarray,您会看到它有两个接受切片参数的运算符[],一个是const,另一个是not const

const版本返回std::valarray,它有一个sum方法,non-const返回std::slice_数组,它没有

要解决此问题,请将结果包装在std::valarray中:

return std::valarray(data[std::slice(0, k, 1)]).sum();