2016-11-25 8 views
0
#include <iostream> 

class A { 
public: 
    A() { std::cout << "Constructor" << std::endl; } 
    A(const A& a) { std::cout << "Copy Constructor" << std::endl; } 
    A& operator=(const A& a) { std::cout << "Copy = operator" << std::endl; } 
    A(A&& a) { std::cout << "Move Constructor" << std::endl; } 
    A& operator=(A&& a) { std::cout << "Move = operator" << std::endl; } 
    ~A() { std::cout << "Destructor" << std::endl; } 
}; 

void f(A&& a) { std::cout << "function" << std::endl; } 

int main() { 
    f(A()); 
    return 0; 
} 

でコンパイルした場合でも発生するようですかコピーの省略は、次のプログラムの出力は-fno-Elideの-コンストラクタ

+6

私は驚くほど愚かですか?確かに 'A()'がデフォルトのコンストラクタを呼び出すと、匿名のテンポラリは 'f(A &&)'にバインドできます。私は何が欠けていますか?移動コンストラクタは、構築されたオブジェクトを持つ場合にのみ呼び出すことができます。 – Bathsheba

+1

@Bathsheba:私は何かが足りないとは思わない。 'A foo();'が与えられていると、 'A {{foo()};}は移動コンストラクタを呼び出しますが、そのまま移動することはありません。 –

+0

@Bathsheba "私は何が欠けていますか?"私は知らない...良い品質の個人的な時間?多分、寝ることもありますか? (私に気を付けてはいけません。周りにうずくまります。フレンドリーな冗談、悪意のある人はいません)。 –

答えて

6

短い答え:あなたは何も移動構築中ではありません。

一時的なAオブジェクトを作成し、そのオブジェクトへの参照を渡すだけです。あなたが移動建設を見たい場合は、例えば次のようにすることができます。 fの署名を

に変更してください
void f(A a) 
関連する問題