错误:表达式必须是可修改的LVALUE

Error: Expression must be a modifiable lvalue

本文关键字:修改 LVALUE 表达式 错误      更新时间:2023-10-16

当我尝试将值分配给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的建议,我已经克服了这些问题。但是,在运行parallel_时运行操作员时,但是从未输入for循环。

这是我称parallel_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_devy_devperson)。这是不允许的,这就是为什么您会遇到编译时间错误。

您可能想从方法中删除const

另外,您可以将要修改为mutable的成员数据标记,但这不是首选解决方案,因为它使代码变脆,难以阅读并且可以用多线程造成破坏。

似乎要减少,即计算数据上的一些聚合值。

为此,TBB提供了一个特殊功能模板:parallel_reduce。与您现在使用的parallel_for不同,parallel_reduce不需要Body类的operator()为const,因为该类的实例会累积部分结果。但是,它对班级提出了其他要求:需要一个特殊的构造函数以及一种合并另一个身体实例的部分结果的方法。

更多信息可以在Intel(R)TBB用户指南中找到:http://www.threadingbuildingblocks.org/docs/help/tbb_userguide/parallel_reduce.htm

也有parallel_reduce的过载,它需要两个函子 - 一个用于身体,另一个用于合并部分结果 - 以及用于初始化累加器的特殊"身份"值。但是您正在一次计算三个汇总值,因此您仍然需要一个结构或类以将所有三个值存储在一个变量中。