2017-07-08 5 views
0

私はC++ 11でrvalueという用語を使用しようとしていますが、私はこの奇妙なことに遭遇します。私が理解しているように、foo myfoo(foo())を呼び出すと一時的なfooが作成され、次にそれがmyfooに移動されます。一時オブジェクトを移動コンストラクタに渡すことができません

しかし、Visual Studio 2015では、コンパイルしようとするとmyfooが存在しないことがわかります。これはバグですか?

#include<iostream> 
using namespace std; 

class foo 
{ 
    static int n; 
    int id; 
public: 
    foo() :id(n) { ++n; cout << "Created: " << id << endl; } 
    foo(foo &o) :id(o.id) { cout << "Copy: " << id << endl; } 
    foo(foo &&o) :id(o.id) { cout << "Move: " << id << endl; } 
    ~foo() { cout << "Destroy: " << id << endl; } 
    void bar(){cout << "I am: " << id << endl; } 
}; 
int foo::n = 0; 

int main() 
{ 
    foo myfoo (foo()); 
    myfoo.bar(); 
    return 0; 
} 

答えて

0

これは、最も厄介な構文解析の例です。 C++は、foo引数を指定してfooを返す関数としてmyfooの構造を解釈します。

foo myfoo { foo() }; 
+0

うわー:

は、この問題を解決するには、一時的なのfoo()

foo myfoo ((foo())); 

または使用初期化リストの周りに追加のかっこを配置する必要があります。大括弧が必要だとは思わなかった。 foo myfoo(foo())を使用するとどうなりますか?それは無効な構文ですか? – bot1131357

関連する問題