可以在不明确使用右值引用的情况下移动对象?

时间:2015-04-14 09:22:18

标签: c++ c++11 rvalue-reference

我尝试了以下代码,但结果出乎意料。

#include <string>
#include <iostream>
#include <string>

using namespace std;

class A {
public:
    string s;
    A(string x) : s(x) { cout << "A:" << s << endl; }
    A(const A&& x) : s(x.s) { cout << "Am:" << s << endl; }
    A(const A& x) : s(x.s) { cout << "Ac:" << s << endl; }
    ~A() { cout << "~A: " << s << endl; }
};


A f(A& a) {
    A r(a.s + "'");
    return r;
}

int main(int argc, char *argv[]) {
    A a("1");
    A b(f(a));
    cout << b.s << endl;
    return 0;
}

结果是,

$ c++ -g -std=c++0x /home/takayuki/tmp/x.cpp && ./a.out
A:1
A:1'
1'
~A: 1'
~A: 1

根据我的理解,构造函数和析构函数应该每次调用3次,因为f创建了局部变量,但结果却没有。 这种编译器优化吗?或者我的理解有问题吗?

0 个答案:

没有答案