为什么不调用移动构造函数?

Why is the move constructor not called?

据我了解,创建临时对象时会调用移动构造函数。这里 getA() 函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:

#include <iostream>

using namespace std;

class A
{
    public:
    A()
    {
        cout<<"Hi from default\n";
    }

    A(A && obj)
    {
        cout<<"Hi from move\n";
    } 
};

A getA()
{
    A obj;
    cout<<"from getA\n";
    return obj;
}

int main()
{
    A b(getA());

   return 0;
}

允许编译器优化实例 obj 并将对象直接发送回调用者,而无需获取概念值副本。

这叫做namedreturn价值优化(NRVO)。这是比经典 return 值优化 (RVO) 更积极的优化,编译器可以调用它来避免匿名临时值的复制。

为避免疑义,编译器可以这样做即使这样做会产生副作用(在您的情况下缺少控制台输出)。