【问题标题】:Using Move Constructor [duplicate]使用移动构造函数[重复]
【发布时间】:2015-01-02 13:37:51
【问题描述】:

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

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()

谢谢。

【问题讨论】:

标签: c++ c++11 move-semantics


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    编译器优化了对移动构造函数的需求。有没有试过禁用优化,检查结果是否一样?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2021-12-25
      • 2021-12-12
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多