2017-07-08 99 views
0

我試圖用C++ 11中的右值來解決這個問題,並且我遇到了這種奇怪現象。據我所知,調用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++將myfoo構造解釋爲用foo參數返回foo的函數。

要解決這個問題,你需要把額外的括號周圍臨時富()

foo myfoo ((foo())); 

或者使用初始化列表:

foo myfoo { foo() }; 
+0

哇。沒想到括號是需要的。當我使用foo myfoo(foo())時會發生什麼?這是無效的語法? – bot1131357

相關問題