本文主要验证在类的成员函数中,是否可以通过lambda处理成员变量
示例
//file.hpp文件
#include <iostream>
namespace file
{
class MyFile final
{
public:
MyFile();
~MyFile();
public:
void lambdaTest();
void printCountValue();
private:
int32_t m_count{
100};
};
MyFile::MyFile(){
}
MyFile::~MyFile(){
}
/*
* @brief lambda test
*/
void MyFile::lambdaTest()
{
int32_t i = 10;
auto f = [=](){
m_count = m_count * 2; //可以改变成员变量的值
//i = i*2; //值捕获,不允许修改变量的值,会报错
std::cout<<"m_count value is: "<<m_count<<std::endl;
std::cout<<"i value is: "<<i<<std::endl<<std::endl;
};
f();
auto f1 = [&](){
m_count = m_count * 2;
i = i*2;
std::cout<<"m_count value is: "<<m_count<<std::endl;
std::cout<<"i value is: "<<i<<std::endl<<std::endl;
};
f1();
}
void MyFile::printCountValue()
{
std::cout<<"m_count(print) value is: "<<m_count<<std::endl;
}
}
//main.cc
#include <iostream>
#include <ostream>
#include <istream>
#include <fstream> //实现读写文件
#include <iomanip>
#include <string>
#include <sstream>
#include "file.hpp"
using namespace file;
int main(int argc, char* argv[])
{
MyFile myfile;
myfile.lambdaTest();
myfile.printCountValue();
return 0;
}
输出
m_count value is: 200
i value is: 10
m_count value is: 400
i value is: 100
m_count(print) value is: 400
结论
在类的成员函数中,无论是值捕获还是引用捕获,都可以改变成员变量的值。
讨论
1.在类的成员函数中,lambda函数是否也认为是类的内部,所以可以通过值捕获来修改成员变量的值;
2.在类的成员函数中,lambda的捕获列表不能写成员变量[m_count] 或 [&m_count],否则会报错;但是可以直接写[=]或[&]