gpt4 book ai didi

C++ move 构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:25:37 25 4
gpt4 key购买 nike

使用或创建 move 构造函数的正确方法是什么?

这是一个例子:

class Example
{
public:
Example( int && p_Number,
bool && p_YesNo,
std::string && p_String ) : // Error here
Number( p_Number ),
YesNo( p_YesNo ),
String( p_String )
{
};

private:
int Number;
bool YesNo;
std::string String;
std::vector< unsigned char > Vector;
};

void ShowExample( void )
{
Example ExampleA( 2013,
true,
"HelloWorld" // Why won't it work?
);
};

我已经在评论中显示了错误。

编辑:*好吧,我现在确定我拥有的不是 move 构造函数。那么,我可以写一个吗?*

最佳答案

首先,没有理由为那个类写一个 move 构造函数。编译器生成的一个就可以了。但是,如果您要编写它,它可能看起来像这样:

Example(Example && rhs)
:Number(rhs.Number)
,YesNo(rhs.YesNo)
,String(std::move(rhs.String))
,Vector(std::move(rhs.Vector))
{}

如果你愿意,为了保持一致性,你可以在 intbool 上调用 std::move,但你不会从中得不到任何好处。

对于带有所有参数的其他构造函数,最简单的做法是:

Example(int p_Number, bool p_YesNo, std::string p_String)
:Number(p_Number)
,YesNo(p_YesNo)
,String(std::move(p_String))
{}

回应您的以下评论:

每当您尝试构造一个具有与唯一构造函数参数相同类型的 R 值的对象时,就会调用 move 构造函数。例如,当一个对象通过函数的值返回时,即 R 值,尽管在这种情况下,通常会完全跳过复制和 move 。您可以通过对 L 值调用 std::move 来创建 R 值。例如:

Example ex1(7, true, "Cheese"); // ex1 is an L-value
Example ex2(std::move(ex1)); // moves constructs ex2 with ex1

关于C++ move 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169224/

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