以下代码示例仅关注构造函数。 基本上,我的问题是关于为什么不调用移动构造函数,以及它是否因为它以某种方式被编译器“优化掉”了?
#include <iostream>
class Foo{
public:
int x_;
Foo(const int x = 0) : x_{x} {std::cout << "Default constructor used..." << std::endl;}
Foo(Foo&& f) : x_{f.x_} {std::cout << "Move constructor used..." << std::endl;}
Foo(const Foo& f) : x_{f.x_} {std::cout << "Copy constructor used..." << std::endl;}
};
Foo operator+(const Foo& f1, const Foo& f2)
{
Foo f; // default constructor used
f.x_ = f1.x_ + f2.x_;
return f;
}
int main()
{
Foo f1(3), f2(2); // two default constructor calls
Foo f = f1; // copy constructor gets called
Foo f_ = f1 + f2; // move is NOT called
std::cout << f.x_ << std::endl;
return 0;
}
基于我在移动构造函数上所读到的内容,应该为行
调用移动构造函数Foo f_ = f1 + f2;
但事实并非如此。
f1 + f2
不是左值,而是左值。
实际上,似乎没有为构造f_调用构造函数。 该计划的输出是:
Default constructor used...
Default constructor used...
Copy constructor used...
Default constructor used...
3
对我而言,f_的构造看起来像是“隐藏的”。 我在Windows 8.1上使用g ++版本4.8.1(64位)。
感谢任何帮助。 谢谢。