- 論壇徽章:
- 2
|
回復(fù) 1# Ruckus優(yōu)科
- void push_back(const value_type& x);
- void push_back(value_type&& x);
- template <class... Args> void emplace_back(Args&&... args);
復(fù)制代碼 第1個是c++98的。
第2個是c++11的。 因為value_type&& x只能綁定右值, 所以可以將x用作move。
第3個也是c++11的。 Args&&不一定是右值引用, 這個東西叫universal references或forwarding references。
這個解釋起來有些復(fù)雜。。。 還是看 Universal References in C++11—Scott Meyers 比較專業(yè)。。。
于是可以先從另一個(也許會更容易)的方式看待C++11新加入的這兩貨 —— push_back(&&)和emplace_back —— 的不同, 就是emplace_back的參數(shù)個數(shù)。。。
push_back的右值重載,傳遞的始終是一個參數(shù), 類型是容器的元素類型。
vector<string> xs;
xs.push_back("implicit"); // 實際是調(diào)用/* non explict */ string(const char* s)構(gòu)造一個臨時的string對象
xs.push_back(string("explicit")); // 是顯式調(diào)用 string(const char* s)構(gòu)造。。。
xs.push_back(string("hello world", 5)); // 是調(diào)用 string (const char* s, size_t n) 構(gòu)造。。。
xs.push_back(string(6, '0')); // 調(diào)用 string (size_t n, char c) 。。。
xs.push_back(string()); // 調(diào)用 string() 默認構(gòu)造。。。
它們都是先用各種參數(shù)構(gòu)造一個臨時的string作為push_back的參數(shù), 通過它構(gòu)造出xs內(nèi)的那個元素, 即xs.back()。 然后銷毀那個臨時的string。
語義上總共兩個構(gòu)造。 一個析構(gòu)。 第2個構(gòu)造是通過move。
而emplace_back是不定長,不定類型的函數(shù)模板。
xs.emplace_back("explicit"); // string(const char* s)
xs.emplace_back("hello world", 5); // string (const char* s, size_t n)
xs.emplace_back(6, '0'); // string (size_t n, char c)
xs.emplace_back(); // string()
這些參數(shù)(包括最后一個沒有參數(shù))轉(zhuǎn)發(fā)到string的構(gòu)造函數(shù)(包括默認構(gòu)造函數(shù)), 直接構(gòu)造xs.back()。
語義上總共一個構(gòu)造。 零個析構(gòu)。 |
|