gpt4 book ai didi

c++ - 如果传递函数,右值引用是否优化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:53 24 4
gpt4 key购买 nike

我有[简化]代码:

class AClass{
public:
AClass( BigClass && bc ) : m_bc{std::move(bc)} {}

private:
BigClass m_bc;
};

AClass * aFunction( BigClass && bc ){
return new AClass( std::move(bc) );
}

它有效。但这是正确的吗? BigClass 数据在调用时移动而不创建临时数据?

最佳答案

是的,你所拥有的是正确的。您需要使用 std::move 否则代码将无法编译。原因可能不是很明显。如果我们这样调用您的函数:

AClass *a = aFunction(BigClass{});

aFunction 使用右值调用,右值是 BigClass 的默认构造函数的返回值。但在 aFunction 内部,变量 bc 是一个左值。请记住,如果它有名称,那么它就是一个左值。我们必须使用 std::movebc 转换为右值,以便使用 AClass 的移动构造函数。

为了更清楚地看到这一点,让我们向 AClass 添加一些打印输出(和一个复制构造函数):

AClass( BigClass & bc ) : m_bc{bc} { std::cout << "Copy\n"; }
AClass( BigClass && bc ) : m_bc{std::move(bc)} { std::cout << "Move\n"; }

如果您将 std::move 留在 aFunction 之外,您将获得拷贝。有了它,您就可以开始行动了。

关于c++ - 如果传递函数,右值引用是否优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15414841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com