gpt4 book ai didi

c++ - 前进或 move 与否;如何确定在类的使用上下文中哪个是首选?

转载 作者:行者123 更新时间:2023-12-02 11:13:37 25 4
gpt4 key购买 nike

class Test {
public:
typedef std::set<std::pair<double, double>> DataSet;

explicit Test(const DataSet&& d) {
for (auto &itr : d) {
std::cout << "value1 = " << itr.first << '\n';
std::cout << "value2 = " << itr.second << '\n';
}
}

};

int main() {
//using namespace util;
try {
// Forwarding
Test obj( std::forward<Test::DataSet>(
{
{ 10.0, 20.0 },
{ 30.0, 40.0 },
{ 50.0, 60.0 }
}
));

std::cout << '\n';

// Move
Test obj2(std::move(Test::DataSet(
{
{ 10.0, 20.0 },
{ 30.0, 40.0 },
{ 50.0, 60.0 }
}
)
));

} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}

最佳答案

都不是。

Test::DataSet(/*...*/) 已经是一个可以绑定(bind)到右值引用的右值。 std::move 唯一做的就是将左值转换为 xvalue(即右值),以便它可以绑定(bind)到右值引用,而左值则不能。所以 std::move 是多余的。

std::forward 仅在其模板参数上执行相同的操作。所以它(充其量)也是多余的。

const DataSet&& 作为参数没有任何意义。您需要仅绑定(bind)到右值的 DataSet&& 或绑定(bind)到右值和左值的 const DataSet&

如果您想利用传递的引用可能是右值这一事实(即通过从其成员 move ),那么您需要对函数进行两次重载。一种采用 DataSet&&,使用右值参数调用,另一种采用 const DataSet&,使用左值参数调用。

在您问题中的 Test 函数的具体情况下,我不知道从成员中移出或对 DataSet< 进行任何其他修改有什么好处 状态,所以我会简单地使用 const DataSet& 作为参数,而不必担心 std::moveing 或 std::forward专门进入该函数。

关于c++ - 前进或 move 与否;如何确定在类的使用上下文中哪个是首选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59544653/

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