gpt4 book ai didi

c++ - 在 C++0x 中传递/移动构造函数的参数

转载 作者:IT老高 更新时间:2023-10-28 13:00:46 25 4
gpt4 key购买 nike

如果我有一个带有 n 个参数的构造函数,这样任何参数都可以是右值和左值。是否可以通过右值的移动语义来支持这一点,而无需为每个可能的右值/左值组合编写 2^n 构造函数?

最佳答案

你按值取每一个,像这样:

struct foo
{
foo(std::string s, bar b, qux q) :
mS(std::move(s)),
mB(std::move(b)),
mQ(std::move(q))
{}

std::string mS;
bar mB;
qux mQ;
};

参数对函数参数的初始化将是复制构造函数或移动构造函数。从那里,您只需将函数参数值移动到您的成员变量中。

记住:复制和移动语义是由类(class)提供的服务,而不是你自己提供的服务。在 C++0x 中,您不再需要担心如何获取自己的数据“拷贝”;只是要求它,让类(class)去做:

foo f("temporary string is never copied", bar(), quz()); // no copies, only moves
foo ff(f.mS, f.mB, f.mQ); // copies needed, will copy
foo fff("another temp", f.mB, f.mQ); // move string, copy others

注意:您的构造函数只接受值,这些值将弄清楚如何构造自己。当然,您可以从那里将它们移动到您想要的位置。

这适用于任何地方。有需要复制的功能吗?使其在参数列表中:

void mutates_copy(std::string s)
{
s[0] = 'A'; // modify copy
}

mutates_copy("no copies, only moves!");

std::string myValue = "don't modify me";
mutates_copy(myValue); // makes copy as needed
mutates_copy(std::move(myValue)); // move it, i'm done with it

在 C++03 中,你可以很好地模拟它,但它并不常见(根据我的经验):

struct foo
{
foo(std::string s, bar b, qux q)
// have to pay for default construction
{
using std::swap; // swaps should be cheap in any sane program

swap(s, mS); // this is effectively what
swap(b, mB); // move-constructors do now,
swap(q, mQ); // so a reasonable emulation
}

std::string mS;
bar mB;
qux mQ;
};

关于c++ - 在 C++0x 中传递/移动构造函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688603/

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