#include <string>
#include <vector>
using namespace std;
auto f()
{
vector<string> coll{ "hello" };
//
// Must I use move(coll[0]) ?
//
return coll[0];
}
int main()
{
auto s = f();
DoSomething(s);
}
Tôi biết: Nếu tôi chỉ return coll;
, thì coll
sẽ được đảm bảo sẽ được hoàn lại.Đối tượng phụ của đối tượng tạm thời có được đảm bảo được di chuyển khi trả lại không?
Tuy nhiên, tôi không chắc chắn: Liệu coll[0]
cũng được đảm bảo sẽ được chuyển khi bạn quay lại?
Cập nhật:
#include <iostream>
struct A
{
A() { std::cout << "constructed\n"; }
A(const A&) { std::cout << "copy-constructed\n"; }
A(A&&) { std::cout << "move-constructed\n"; }
~A() { std::cout << "destructed\n"; }
};
struct B
{
A a;
};
A f()
{
B b;
return b.a;
}
int main()
{
f();
}
gcc 6.2 và kêu vang 3,8 kết quả đầu ra như nhau:
xây dựng
copy-xây dựng
destructed
destructed
"sau đó' coll' được đảm bảo sẽ được di chuyển khi trả lại ". Không, không phải vậy. Bản sao có thể được elided, trong trường hợp đó, không có di chuyển. – juanchopanza
Bạn không sử dụng giá trị trả về của f() để có gì để di chuyển? – Surt
Và các điều kiện mà theo đó một giá trị có thể được di chuyển được kết hợp chặt chẽ để sao chép elision (xem câu trả lời của tôi.) – juanchopanza