C++已经有了引用操作符&为什么C++11还要引入std:ref

 我来答
cqdjyy01234
2015-08-28 · TA获得超过1147个赞
知道小有建树答主
回答量:267
采纳率:50%
帮助的人:304万
展开全部

首先,&是类型说明符,而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让用户进行选择。此时,用户相当于传入了一个会自动解引用的指针,可以复制,且影响原始参数。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式