C++ 错误:表达式必须是可修改的左值

C++ 错误:表达式必须是可修改的左值,c++,tbb,lvalue,C++,Tbb,Lvalue,当我试图给x_dev、y_dev和pearson赋值时,for循环中出现了这个错误。就我所知,它们都应该是可修改的。有人能看出我哪里出了错吗 class LoopBody { double *const x_data; double *const y_data; double const x_mean; double const y_mean; double x_dev; double y_dev; double pearson;

当我试图给x_dev、y_dev和pearson赋值时,for循环中出现了这个错误。就我所知,它们都应该是可修改的。有人能看出我哪里出了错吗

class LoopBody
{  
    double *const x_data;
    double *const y_data;
    double const x_mean;
    double const y_mean;  
    double x_dev;
    double y_dev;
    double pearson; 


public:
    LoopBody(double *x, double *y, double xmean, double ymean, double xdev, double ydev, double pear) 
            : x_data(x), y_data(y), x_mean(xmean), y_mean(ymean), x_dev(xdev), y_dev(ydev), pearson(pear) {}  

    void operator() (const blocked_range<size_t> &r) const {              
        for(size_t i = r.begin(); i != r.end(); i++)
        {
            double x_temp = x_data[i] - x_mean;
            double y_temp = y_data[i] - y_mean;

            x_dev += x_temp * x_temp;
            y_dev += y_temp * y_temp;

            pearson += x_temp * y_temp;

        }
    }
};
遵照@Bathsheba的建议,我克服了这些问题。但是,当运行并行_时,操作员将运行,但从未输入for循环

这就是我称之为并行_的地方:

parallel_for(blocked_range<size_t>(0,n), LoopBody(x, y, x_mean, y_mean, x_dev, y_dev, pearson), auto_partitioner());
运算符标记为const,您正试图修改类成员数据,例如x_dev、y_dev和person。这是不允许的,这就是为什么会出现编译时错误

您可能希望从方法中删除常量

或者,您可以将要修改的成员数据标记为可变的,但这不是首选的解决方案,因为它会使代码变得脆弱、难以阅读,并且会对多线程造成严重破坏。

运算符标记为const,您正试图修改类成员数据,例如x_dev、y_dev和person。这是不允许的,这就是为什么会出现编译时错误

您可能希望从方法中删除常量


或者,您可以将要修改的成员数据标记为可变的,但这不是首选的解决方案,因为它会使代码变得脆弱、难以读取,并且会对多线程造成严重破坏。

似乎您希望进行缩减,即对数据计算一些聚合值

为此,TBB提供了一个特殊的函数模板:parallel_reduce。与您现在可能使用的parallel_不同,parallel_reduce不要求body类的运算符为const,因为该类的实例会累积部分结果。但是,它对类提出了其他要求:需要有一个特殊的构造函数以及一个方法来合并来自另一个实体实例的部分结果

更多信息可在IntelR TBB用户指南中找到:


还有一个parallel_reduce重载,它使用两个函子——一个用于主体,另一个用于合并部分结果——以及一个用于初始化累加器的特殊标识值。但是您同时计算三个聚合值,因此您仍然需要一个结构或类来将所有三个值存储在一个变量中。

似乎您想要进行缩减,即对数据计算一些聚合值

为此,TBB提供了一个特殊的函数模板:parallel_reduce。与您现在可能使用的parallel_不同,parallel_reduce不要求body类的运算符为const,因为该类的实例会累积部分结果。但是,它对类提出了其他要求:需要有一个特殊的构造函数以及一个方法来合并来自另一个实体实例的部分结果

更多信息可在IntelR TBB用户指南中找到:


还有一个parallel_reduce重载,它使用两个函子——一个用于主体,另一个用于合并部分结果——以及一个用于初始化累加器的特殊标识值。但您同时计算三个聚合值,因此,您仍然需要一个结构或类来将所有三个值存储在单个变量中。

这解决了这个问题,但现在我在编译时遇到了一个错误:c:\program files x86\tbb41\include\tbb\parallel\u for.h110:错误C3848:具有“const LoopBody”类型的表达式将丢失一些const volatile限定符,以便调用“void”LoopBody::operator const tbb::blocked_range&'谷歌搜索这表示修复将包括我刚刚删除的const。问题是不应该修改类成员数据。你为什么要这么做?如果您真的需要,那么也许,使类成员可变并标记函数const是前进的方向。但出于我在答案中陈述的原因,我不喜欢这样做。你完全正确,不应该修改类成员,特别是因为tbb::parallel_for使用了主体的多个实例,并且在单个实例中积累的任何内容都将丢失。因此,const和mutable的组合只会隐藏真正的问题。正确的解决方案是使用tbb::parallel_reduce。这解决了这个问题,但我现在在编译时遇到了一个错误:c:\program files x86\tbb41\include\tbb\parallel_for.h110:error C3848:type为“const LoopBody”的表达式将丢失一些const volatile限定符,以便调用“void LoopBody::operator const tbb::blocked_range&”谷歌搜索说,修复程序将包括我刚刚删除的常量。问题是,不应该修改类成员数据。你为什么要这么做?如果您真的需要,那么也许,使类成员可变并标记函数const是前进的方向。但是我不喜欢这样,因为我在答案中陈述了原因。你绝对正确,不应该修改类成员,特别是因为tbb::p arallel_for使用身体的多个实例,在单个实例中积累的任何内容都将丢失。因此,const和mutable的组合只会隐藏真正的问题。正确的解决方案是使用tbb::parallel\u reduce。