#include<vector>
struct A { int a[100]; };
void foo (const A& a) {
std::vector<A> vA;
vA.push_back(std::move(a)); // how does move really happen?
}
int main() {
A a;
foo(a);
}
上面的代碼編譯得很好。現在,無處不在寫着move
避免複製。
以下是我的疑問:std ::移動工作左值引用? std :: move如何在標準容器上工作?
- 是否真的
move
當一個有左值 [無]涉及的工作 -const
參考? - 即使使用「右值引用」,如果將對象 插入到上述標準容器中,複製過程如何避免?
例如
void foo (A&& a) { // suppose we invoke this version
std::vector<A> vA;
vA.push_back(std::move(a)); // how copy is avoided?
}
它的工作原理是'std :: move(a)'產生一個'const A &&'(記住'std :: move'只是將它的參數轉換爲一個右值引用)。但是不存在'push_back(const A &&)' - 只有'push_back(const A&)'和'push_back(A &&)' - 這樣的事情,並且第一個被調用,導致複製發生(因爲你不能將一個const rvalue引用綁定到一個非const rvalue引用,但你可以將它綁定到一個常量左值引用)。 – peppe
你是什麼意思,「如何避免副本?」。你問如何實現vector :: push_back(T &&)? –
@SteveJessop,以某種方式是。但我不會在細節上做太多的事情。我的基本問題是,因爲來自外部的A && a可能會在某個位置創建。 'std :: vector'是連續的容器。怎麼可能避免複製呢? – iammilind