91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++11萬能引用和右值引用的方法

發布時間:2022-03-25 13:36:23 來源:億速云 閱讀:166 作者:iii 欄目:開發技術

這篇文章主要介紹了C++11萬能引用和右值引用的方法的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++11萬能引用和右值引用的方法文章都會有所收獲,下面我們一起來看看吧。

正文

實際上,type&& 有兩種不同的含義。
其中一種就是 右值引用。它僅僅會綁定右值,用于識別出可移對象。
另外一種含義,則表示既可以是右值引用,也可以是左值引用。這種雙重特性使其可以綁定到右值,也可以綁定到左值。還可以綁定到const對象或非const對象,以及volatile對象,甚至可以綁定那些既帶有const又帶有volatile的對象,擁有很強的靈活性,這就是萬能引用。

那么,既然以上兩種含義都是 type&& 結構,那么如何來區分二者呢?

萬能引用

萬能引用通常會在兩種場景現身:函數模板的形參 和 auto聲明。
示例如下:

template<typename T> 
void f(T&& param);   //param是個萬能引用
 auto && var2 = var1;

以上兩種場景的共同之處,在于它們都涉及型別推導。

在模板f中,param的類型是推導得到的,而在var2的聲明語句中,var2的類型也是推導得到的。

因為萬能引用首先是個引用,所以初始化是必須的。萬能引用的初始化物會決定它代表的是個左值還是右值引用,如果初始化物是左值,萬能引用就會對應得到一個左值引用,同理,如果初始化物是右值,萬能引用就會對應得到一個右值引用。
對于作為函數形參的萬能引用而言,初始化物在調用處提供:

template<typename T> 
void f(T&& param);

Widget w;
f(w);             //左值被傳遞給f,param的類型是Widget&,即左值引用

f(std::move(w));  //右值被傳遞給f,param的類型是Widget&&,即右值引用

有一個需要注意的問題是,萬能引用除了要涉及型別推導,還有一個條件必須限定,就是必須要是“T&&”結構才行。
而類似

template<typename T> 
void f(std::vector<T>&& param);   //param是右值引用

這樣的類型并不是萬能引用,僅僅只是一個右值引用。

而且,如果有const修飾也不可能成為萬能引用,比如:

template<typename T> 
void f(const T&& param);  //param是右值引用

那么,位于模板內是不是就一定就會涉及到型別推導呢? 還真不能保證。看以下示例:

template <class T,class Allocator = allocator<T>>
class vector{
public:
    void push_back(T&& x);
    ...
};

以上是來自C++標準中vector類

這里的push_back的形參具備萬能引用的正確形式,但是在本示例中,并不涉及到類型推導。因為push_back作為vector本身的一部分,如果不存在特定的vector實例,則它也無從存在。該實例的具體類型完全決定了push_back的聲明類型。
如:

std::vector<Widget> v;

會導致std::vector模板具現化為如下實例:

template <class Widget,class Allocator = allocator<Widget>>
class vector{
public:
    void push_back(Widget&& x);  //右值引用
    ...
};

現在就能看清楚push_back并未涉及到類型推導。

而vector中的另外一個函數卻涉及到了類型推導,如下:

template <class T,class Allocator = allocator<T>>
class vector{
public:
    template<class... Args>
    void emplace_back(Args&&... args);
    ...
};

關于“C++11萬能引用和右值引用的方法”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++11萬能引用和右值引用的方法”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

宿迁市| 屏山县| 南投县| 大洼县| 新建县| 宁陵县| 板桥市| 含山县| 吉木萨尔县| 江陵县| 仲巴县| 忻州市| 石狮市| 江北区| 赫章县| 柏乡县| 江都市| 安溪县| 正蓝旗| 建昌县| 新疆| 闸北区| 赣州市| 巩义市| 古丈县| 长乐市| 双鸭山市| 财经| 博罗县| 阜平县| 广宁县| 大连市| 双桥区| 盐池县| 淮阳县| 华坪县| 梅河口市| 贵州省| 高清| 虎林市| 邻水|