C++已经有了引用操作符&为什么C++11还要引入std:ref
1个回答
展开全部
首先,&是类型说明符,而std::ref是一个函数,返回std::reference_wrapper(类似于指针)。
为什么需要std::ref?(std::cref类似)
主要是考虑到c++11中的函数式编程,例如:std::bind。
示例:
#include <iostream>
#include <functional>
void foo(int& a) {
++a;
}
void test_function(std::function<void(void)> fun) {
fun();
}
int main() {
int a = 1;
std::cout << "a = " << a << "\n";
test_function(std::bind(foo, a));
std::cout << "a = " << a << "\n";
test_function(std::bind(foo, std::ref(a)));
std::cout << "a = " << a << "\n";
return 0;
}
输出:
a = 1
a = 1
a = 2
注意第二行"a = 1",为什么a没有发生改变呢?因为std::bind将参数拷贝了。因而foo改变的是拷贝,不影响a。问题来了:为什么std::bind要拷贝参数,而不是直接保存引用呢?这主要是考虑到调用者的需求。确实存在一些情况,我们并不希望std::bind直接对参数进行操作。为了满足不同的调用者的需求,只能统一进行拷贝。同时,为了可以使用引用,提供了std::ref,std::cref让用户进行选择。此时,用户相当于传入了一个会自动解引用的指针,可以复制,且影响原始参数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询