函数参数Const int& value的更新问题

96 阅读1分钟

写代码的时候突然想到一种情况,顺手测试了下发现和预想的不一样,记录一下。

代码是这样的:

#include <iostream>
#include <thread>

void printfValue(const int& value) {

	while (true) {
		std::cout << "printf: " << value << "\n";
		std::this_thread::sleep_for(std::chrono::seconds(1));
	}

}

void changeValue(int& value) {

	while (true) {
		
		std::cout << "change: " << value++ << "\n";
		std::this_thread::sleep_for(std::chrono::seconds(1));
	}
}

int main() {

	int value = 10;
	std::thread thPrintf(printfValue, value);
	std::thread thChange(changeValue, std::ref(value));


	while (true) {
		std::this_thread::sleep_for(std::chrono::seconds(100));
	}

	return 0;
}

很简单的功能,想看看对同一个地址的数据读写的更新结果。

运行结果是:

image.png

printfValue的值一直没有变化。

按理来说,既然是&,那就是指向的同一块地址,就算是const,那也只是不能修改,但读取应该是一样的才对。

分析之后,觉得这种说法比较正确:

在std::thread的时候,如果参数是引用,那就要使用std::ref(),如果没有,编译器就会创建一个临时变量存储value的值,并且把这个临时变量的地址给printfValue,所以就算changeValue修改value的值,printfValue也不会改变。

修改代码后:

	std::thread thPrintf(printfValue, std::ref(value));
	std::thread thChange(changeValue, std::ref(value));

结果如下:

image.png

ok,这就得到想要的效果了。

除此之外,如果改成:

image.png

就会得到这样的编译错误:

image.png