#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);
}
私にはちょうどreturn coll;
の場合は、coll
が返品時に移転することが保証されています。テンポラリオブジェクトのサブオブジェクトは、返されて移動することが保証されていますか?
ただし、わかりません:coll[0]
の返品はいつでも保証されますか?
更新:
#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と3.8打ち鳴らす出力同じ:
が
コピー構築
は
を破壊構築は
"ならば、' coll'は返却時に移動することが保証されます。いいえ、そうではありません。コピーは省略されてもよく、その場合、移動はありません。 – juanchopanza
あなたはf()の戻り値を使用していないので、移動させるものは何ですか? – Surt
左辺値を移動できる条件は、コピーエリジョンと密接に関連しています(私の答えを参照してください)。 – juanchopanza