微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 三元运算符调用复制构造函数而不是移动构造函数

如何解决C++ 三元运算符调用复制构造函数而不是移动构造函数

我正在使用 VS Code 在 Linux 中使用 g++ 进行编译和调试。

需要的包含和使用:

#include <string>
#include <iostream>

using namespace std;

这是我的可移动类:

class A {
public:
    A(const string& strA) : strA(strA) {}

    A(const A& a) : A(a.strA) {
    }

    A(A&& a) : A(a.strA) {
        a.strA = "";
    }

    string strA;
};

返回 A 实例的示例函数

A RetA() {
    A a("a");
    A b("bha");

    string ex;
    cin >> ex;
    a.strA += ex;

    return ex == "123" ? a : b;
}

这里是简单的主要内容

int main() {
    A a(RetA());

    return 0;
}

RetA 函数中的返回值是复制未移动。为什么?

另一方面,如果我们在 RetA 函数中使用“explicitly if”而不是三元运算符:

A RetA() {
    A a("a");
    A b("bha");

    string ex;
    cin >> ex;
    a.strA += ex;

    if (ex == "123")
        return a;

    return b;
}

然后是移动不复制。这已经是预期的行为。但奇怪的是,移动操作不适用于三元运算符。应该是这样还是它是一个错误或 VS Code 等的东西?

解决方法

return 语句中的“自动”移动受到限制:

来自Automatic move from local variables and parameters

如果表达式是一个(可能有括号的)id 表达式,它命名一个变量,其类型为 [..]

return ex == "123" ? a : b; 并非如此。

然后正常方式完成,ex == "123" ? a : b返回一个左值,因此发生复制。

你可能会

return std::move(ex == "123" ? a : b);

return ex == "123" ? std::move(a) : std::move(b);

有手动move

使用 if 允许自动移动遵循上述规则

if (ex == "123")
    return a;
else
    return b;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。