根據我的理解,參考包裝器只是參考的包裝器,沒有什么特別之處。但是當作為函式引數傳遞時,為什么它被視為函式內部的參考本身(而不是包裝器)?
#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 本身?我遇到這個問題是因為我試圖了解在不同執行緒之間傳遞資料時 ref() 的用法。我認為 ref() 是必要的,因此不需要重寫任何帶有“&”的函式引數以避免執行緒相互干擾。但是為什么執行緒可以在不使用 x.get() 的情況下將 ref(x) 視為 x 呢?
uj5u.com熱心網友回復:
f(ref(x)); // f on int called, why?
因為std::reference_wrapper有一個轉換運算子到存盤的參考;ref(x)回傳一個std::reference_wrapper,可以int&隱式轉換為。
void f(reference_wrapper<int>& x)接受非常量的左值參考,std::ref回傳按值,即它回傳的是一個不能系結到非常量的左值參考的右值。然后f(ref(x));呼叫第一個多載f而不是第二個。如果您將其更改為void f(reference_wrapper<int> x)orvoid f(const reference_wrapper<int>& x)然后它將被呼叫。
居住
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399892.html
上一篇:在回圈內運行函式而不停止
下一篇:每個原子的記憶體順序是否正確?
