C++11 std::bind std::ref
阿新 • • 發佈:2019-02-12
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傳遞了引用,如果函式本身只接受值型別引數,傳遞的仍然是值而不是引用。