爲了實現*
運營商的完美轉發,我構建了以下示例。完美轉發和臨時對象的範圍
#include <string>
#include <iostream>
class A {
public:
std::string name;
A(const A& _other) : name(_other.name) {
std::cout << "Copy-Construct with name: " << name << std::endl;
}
A(A&& _other) : name(std::move(_other.name)) {
std::cout << "Move-Construct with name: " << name << std::endl;
}
A(std::string _name): name(_name) { }
};
A operator*(const A& _lhs, const A& _rhs) {
std::cout << "Start Operator Copy with: " << _lhs.name << " " << _rhs.name << std::endl;
A bla(_lhs.name+" "+_rhs.name);
return bla;
}
A&& operator*(A&& _lhs, const A& _rhs) {
std::cout << "Start Operator Move with: " << _lhs.name << " " << _rhs.name << std::endl;
_lhs.name += " "+_rhs.name;
return std::move(_lhs);
}
int main() {
A a("a");
A b("b");
A c("c");
A d("d");
A x = a*b*A("t1")*c*A("t2")*A("t3")*d;
std::cout << "Final result is: " << x.name << std::endl;
}
結果如我所願,特別是只有一個移動構造函數和沒有拷貝構造函數被調用。
Start Operator Copy with: a b
Start Operator Move with: a b t1
Start Operator Move with: a b t1 c
Start Operator Move with: a b t1 c t2
Start Operator Move with: a b t1 c t2 t3
Start Operator Move with: a b t1 c t2 t3 d
Move-Construct with name: a b t1 c t2 t3 d
Final result is: a b t1 c t2 t3 d
現在我的問題是:這是代碼?特別是我可以依靠這樣一個事實:第一個臨時對象(由a和b構造而成)以分號而不是在那之前離開其範圍?並且是構造,將作爲移動參考獲得的對象返回爲移動參考,合法嗎?
你指的是哪個臨時對象? – Pradhan
第一次重載泄漏內存 - 這絕對不是在任何意義上的「完美」。兩個重載都應該按值返回。 –
@JonathanWakely:非常抱歉,那是另一個測試案例。我糾正了它。輸出正確無誤。 – Haatschii