有人可以解釋當(而不是)作為引數傳遞給std::move. 在下面的代碼中,我使用 with 和 without 創建 r 值參考std::move。令我驚訝的是,我沒有得到預期的結果。
#include <iostream>
class A {
public:
A() {
std::cout << "const" << std::endl;
}
A(A&& a) {
std::cout << "move const" << std::endl;
}
~A() {
std::cout << "dest" << std::endl;
}
};
void fn(A&& a) {
std::cout << "inside fn" << std::endl;
}
int main() {
A&& a_ref = std::move(A());
fn(std::move(A()));
A&& a_ref1 = A();
std::cout << "end" << std::endl;
}
這是我得到的輸出
const
dest
const
inside fn
dest
const
end
dest
uj5u.com熱心網友回復:
當您通過函式傳遞臨時物件時,臨時物件的生命周期延長不起作用。當你這樣做
A&& a_ref = std::move(A());
A()系結到的右值參考a_ref不是move. 該引數在函式結束時被銷毀,這意味著它所系結的臨時引數也將被銷毀。這就是為什么我們看到
const
dest
在輸出中,a_ref是一個懸空參考。
和
fn(std::move(A()));
臨時A創建A()并move傳遞對該臨時的參考fun。臨時物件仍然系結到引數,move但由于臨時物件至少在創建它們的完整運算式結束之前存在,所以A()當我們輸入時仍然存在fun。臨時檔案只會在fun與輸出相對應的結束后被銷毀
const
inside fn
dest
然后與
A&& a_ref1 = A();
在這里,我們將臨時直接系結到右值參考。這會將臨時的生命周期延長為參考的生命周期。由于參考是對 main 的本地參考,因此只有在main結束時才會“銷毀”,所以這就是您看到輸出的原因
const
end
dest
uj5u.com熱心網友回復:
這是幾乎相同的程式,還有更多資訊:
class A {
std::string s;
public:
A(std::string s1): s(std::move(s1)) {
std::cout << "ctor for: " << s << std::endl;
}
A(A&& a) {
std::cout << "move ctor for: " << a.s << std::endl;
}
~A() {
std::cout << "dtor for: " << s << std::endl;
}
};
void fn(A&& a) {
std::cout << "inside fn" << std::endl;
}
int main() {
A&& a_ref = std::move(A("1")); // life of temporary is not extended
fn(std::move(A("2"))); // temporary is still alive when calling fn
// above is essentially the same as just: fn(A("2"));
A&& a_ref1 = A("3"); // life of temporary is extended
A&& a_ref2 = std::move(A("4")); // life of temporary is not extended
std::cout << "end" << std::endl;
}
代碼:https ://godbolt.org/z/xT9TcWvqh
延長臨時物件的生命周期需要將臨時物件直接分配給右值或 const 左值參考。哪些是這種情況,A("3")但不是這種情況,A("1")哪些A("4")沒有直接分配給它們的參考,因此它們的參考不會延長它們的生命周期。
輸出和解釋:
ctor for: 1
dtor for: 1 ==> the temporary is dead, life is not extended
ctor for: 2
inside fn
dtor for: 2 ==> end of statement creating 2 (after calling fn)
ctor for: 3 ==> life of 3 is extended
ctor for: 4
dtor for: 4 ==> the temporary is dead, life is not extended
end
dtor for: 3 ==> 3, whose life was extended is dead at the end of main
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441490.html
標籤:C
