C++ 引用包装器作为函数参数

Posted

技术标签:

【中文标题】C++ 引用包装器作为函数参数【英文标题】:C++ reference wrapper as function argument 【发布时间】:2021-12-29 07:51:32 【问题描述】:

据我了解,引用包装器只是引用的包装器,没有什么特别之处。但是为什么当它作为函数参数传递时,它被视为函数内部的引用本身(而不是包装器)?

#include <iostream>
#include <functional>
using namespace std;

void f(int& x)
    cout<<"f on int called"<<endl;


void f(reference_wrapper<int>& x)
    cout<<"f on wrapper called"<<endl;


int main()
    int x = 10;
    f(ref(x)); // f on int called, why?

    reference_wrapper<int> z = ref(x);
    f(z); // f on wrapper called, this makes sense though


为什么 ref(x) 在函数调用中被视为 x 本身?我遇到这个问题是因为我试图了解passing data among different threads 时 ref() 的用法。我认为 ref() 是必要的,因此任何带有 '&' 的函数参数都不需要重写以避免线程相互干扰。但是为什么线程可以在不使用 x.get() 的情况下将 ref(x) 视为 x?

【问题讨论】:

【参考方案1】:
f(ref(x)); // f on int called, why?

因为std::reference_wrapper 对存储的引用有一个转换运算符; ref(x) 返回一个std::reference_wrapper,可以隐式转换为int&amp;

void f(reference_wrapper&lt;int&gt;&amp; x) 对非 const 进行左值引用,std::ref 按值返回,即它返回的是一个右值,它不能绑定到对非 const 的左值引用。然后f(ref(x)); 调用第一个重载的f 而不是第二个。如果将其更改为void f(reference_wrapper&lt;int&gt; x)void f(const reference_wrapper&lt;int&gt;&amp; x),则会调用它。

LIVE

【讨论】:

以上是关于C++ 引用包装器作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章

用于 vsnprintf 函数统一行为的 C++ 可变参数包装器

用函数指针包装 C++ 代码作为 cython 中的模板参数

调用以 std::list 作为参数的 C++ 函数

将图像从 python 包装器传递给 c++ 函数

为具有可变数量参数的不同函数编写通用包装器

从 Swift 将文件作为参数传递给 C++ 方法