emplace back無法支援嗎

2022-10-10 23:27:14 字數 1396 閱讀 7325

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...