私はc++11の移動セマンティクスで遊んでいます
コードで...
#include <vector>
#include <string>
std::vector<std::string> GetNewVector()
{
std::vector<std::string> newVec;
newVec.push_back(std::string("hello")); //(1)
newVec.push_back(std::string("whey")); //(2)
return newVec;
}
int main(int argc, char* argv[])
{
std::vector<std::string> vec = GetNewVector();
}
ポイント(1)で、オブジェクトがベクターに移動されるときに、「hello」オブジェクトの移動コンストラクターが呼び出されます。
ポイント(2)で、最初に「hello」の移動コンストラクターが再度呼び出され(これがベクトルが再割り当てされる場所であると想定しています)、次に「ホエー」移動コンストラクターが呼び出されます。
これはすべて予想どおりですが、ベクトルが最後に返されるときにオブジェクトが再び移動されることを期待していましたがGetNewVector()
、moveコンストラクターは再度呼び出されません。私の推測では、RVOが実行されていますが、デバッグモードでVisual Studio(2k10)を実行しているため、これが発生するかどうかはわかりませんでしたか?
RVOを実行できる場合、moveコンストラクターの使用よりも優先されるというのは本当ですか?