私は右辺値参照を理解するために、この例で遊んでいた:参照はいつRvalue参照ですか?
#include <string>
#include <iostream>
#include <utility>
#include <vector>
class Dog
{
public:
Dog() {};
Dog(Dog&& a) { std::cout << "R value" << std::endl;}
};
Dog foo()
{
return Dog();
}
int main()
{
std::vector<Dog> v;
v.push_back(Dog()); // calls move constructor
Dog c((Dog())); // does not call move constructor
Dog d(foo()); // does not call move constructor
}
私はラインv.push_back(ドッグ())、オブジェクト・ドッグ()で右辺値として扱われている理由を理解するために苦労(そう移動コンストラクタが呼び出されます)が、次の2行は移動コンストラクタを呼び出しません。ここでは、匿名オブジェクトとRValueとの関係を誤解している可能性があります。
RVOとNRVOをルックアップしてメッセージをコンストラクタに入れ、メッセージとともにデストラクタを追加します(ヒント 'c'と' d'はおそらくインプレースで構築されています)。このようなことをテストしている場合は、すべてのコンストラクタ(normal、copy、move)とデストラクタを実装(および計測)すると便利です。 –
はい、それは完全にRVOとNRVOです。ありがとう –