vector
使用emplace_back()
無法新增元素,使用push_back()
卻可以。
難道emplace_back()
與列表初始化不相容?非也!
**片段
std::vector> vec;
vec.emplace_back(); // error
vec.push_back(); // pass
報錯資訊
:8:31: error: no matching function for call to 'std::vector>::emplace_back(
)' 8 | vec.emplace_back();
| ^
include/c++/11/bits/stl_vector.h:1212:2: note: candidate template ignored: substitution failure: deduced incomplete pack <(no value)> for template parameter '_args'
emplace_back(_args&&... __args);
^
對於std::vector
的成員函式:
先看emplace_back()
本質上是乙個模板函式,具體形式為
template< class... args >
void emplace_back( args&&... args );
意味若不確定傳入args
型別,編譯器無法推導預設模板引數args
的值,
進而無法使用std::forward(args)...
**引數進行構造。
再看push_back()
並非模板函式,且其實現存在拷貝而非直接構造
void push_back( const t& value );
編譯器將隱式呼叫std::array::operator=()
處理傳入的引數完成型別轉換。
只需將上述**改為:
vec.emplace_back>();
// or
vec.emplace_back(std::array});
即可通過編譯!
std::vector::emplace_back - cppreference.com
std::vector::push_back - cppreference.com
emplace back與push back的區別
下面舉了幾種比較常見的情況 以下所有 均假設存在乙個teacher類 1 include int main 執行v.push back teacher 這段 時,會發生拷貝構造,也就是將t1物件完全copy乙份到vector容器中 2 include int main 執行.push back st...
vector中emplace back方法的用途
在寫 的過程中,clion提醒我把push back方法替換成emplace back方法 emplace back函式的作用是減少物件拷貝和構造次數,是c 11中的新特性,主要適用於對臨時物件的賦值。在使用push back函式往容器中增加新元素時,必須要有乙個該物件的例項才行,而emplace ...
啟動虛擬化支援後,網絡卡無法啟用
問題 64位cpu,bios中未設定虛擬化支援。主機作業系統 windows xp,vmware workstation 7.01,客戶作業系統fedora 15,32bit。工作正常。在bios中開啟虛擬化支援,啟動xp,啟動fedora,發現無法連線網路。ifconfig lo link enc...