2017-07-08 131 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

相关问题