1. 程式人生 > >C++11 std::bind std::ref

C++11 std::bind std::ref

std::bind 總是拷貝其引數,但是,呼叫者可以使用std::ref來實現傳遞引用給std::bind,翻譯自《Effective Modern C++:改善C++11和C++14的42個具體做法》

原文如下:std::bind always copies its arguments, but callers can achieve the effect of having an argument stored by  reference by applying std::ref to it.

示例程式碼:

#include <iostream>
#include <functional>

void fun(int& _a, int& _b, int _c)
{
	_a++;
	_b++;
	_c++;

	std::cout << "in    fun a:" << _a << " b:" << _b << " c:" << _c << std::endl;
}

int main()
{

	int a = 1, b = 1, c = 1;
	//a被bind傳值
	//b被ref傳引用
	//c被fun傳值
	auto b_fun = std::bind(fun, a, std::ref(b), std::ref(c));
	b_fun();

	std::cout << "after fun a:" << a << " b:" << b << " c:" << c << std::endl;

	return 0;
}

輸出:

in fun a:2 b:2 c:2
after fun a:1 b:2 c:1
請按任意鍵繼續. . .

結論:

a std::bind總是使用值拷貝的形式傳參,哪怕函式宣告為引用

b std::bind可以使用std::ref來傳引用

c std::bind雖然使用了std::ref傳遞了引用,如果函式本身只接受值型別引數,傳遞的仍然是值而不是引用。