使用移动构造函数

Using Move Constructor

我在下面写了 class,我对此有疑问。函数 sayHello() returns 一个将在该行之后被销毁的对象。但是,它不使用移动构造函数。不是右值引用吗?为什么它不使用移动构造函数?

class FString {
private:
    char *ptr;
public:
    FString() : ptr(nullptr) {}

    FString(const char *str) {
        cout << "Called: FString(const char *str)\n";
        //...
    }

    ~FString() {
        cout << "Called: ~FString()\n";
        //...
    }

    FString(FString &&s) {
        cout << "Called: FString(FString &&s)\n";
        //...
    }
};


FString sayHello() {
    FString s("Hello World!");
    return s;
}

int main() {
    FString s("Hello World!");
    FString s2(sayHello());
    return 0;
}

输出:

Called: FString(const char *str)
Called: FString(const char *str)
Called: ~FString()
Called: ~FString()

谢谢。

编译器优化了对移动构造函数的需求。您是否尝试过禁用优化并检查结果是否相同?

棋步被省略;这是在各种情况下允许的优化,即使(如此处)移动构造函数有副作用,因此省略调用会改变程序的行为。

具体来说,当程序使用临时变量(或局部变量,当return从函数中调用时)直接初始化相同类型的对象时,使用相同的存储可以省略该移动对于这两个对象。这发生在这里,无论是在 sayHello 中使用 s 初始化 return 值,还是使用该值初始化 s2 时,都不需要移动或复制构造函数.