无法将临时对象传递给移动构造函数

时间:2017-07-08 13:20:57

标签: c++11

我正试图在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;
}

1 个答案:

答案 0 :(得分:0)

这是最令人烦恼的解析的一个例子。 C ++将myfoo构造解释为一个用foo参数返回foo的函数。

要解决此问题,您需要在临时foo()

周围添加其他括号
foo myfoo ((foo()));

或使用初始化列表:

foo myfoo { foo() };