我的编译器是否优化了函数返回的rvalue?

时间:2014-11-22 10:47:19

标签: c++11 optimization move-semantics

以下代码示例仅关注构造函数。 基本上,我的问题是关于为什么不调用移动构造函数,以及它是否因为它以某种方式被编译器“优化掉”了?

#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位)。

感谢任何帮助。 谢谢。

0 个答案:

没有答案