gpt4 book ai didi

c++ - 当 vector 增长时如何强制执行 move 语义?

转载 作者:IT老高 更新时间:2023-10-28 12:03:22 24 4
gpt4 key购买 nike

我有一个 std::vector 某个类 A 的对象。该类是非平凡的,并且定义了复制构造函数 move 构造函数。

std::vector<A>  myvec;

如果我用 A 对象填充 vector (使用例如 myvec.push_back(a)),则使用复制构造函数 A( const A&) 实例化 vector 中元素的新拷贝。

我能否以某种方式强制使用 A 类的 move 构造函数来代替?

最佳答案

您需要使用 noexcept 通知 C++(特别是 std::vector)您的 move 构造函数和析构函数不会抛出。然后当 vector 增长时会调用 move 构造函数。

这是如何声明和实现受 std::vector 尊重的 move 构造函数:

A(A && rhs) noexcept { 
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ; // etc...
}

如果构造函数不是noexceptstd::vector就不能使用它,这样就不能保证标准要求的异常保证。

有关标准中的内容的更多信息,请阅读 C++ Move semantics and Exceptions

感谢 Bo,他暗示这可能与异常(exception)有关。还要考虑 Kerrek SB 的建议,并尽可能使用 emplace_back。它可以更快(但通常不是),它可以更清晰、更紧凑,但也存在一些缺陷(尤其是非显式构造函数)。

编辑,通常默认是你想要的: move 所有可以 move 的,复制其余的。要明确要求,请写

A(A && rhs) = default;

这样做,您将尽可能获得 noexcept:Is the default Move constructor defined as noexcept?

请注意,早期版本的 Visual Studio 2015 和更早版本不支持这一点,即使它支持 move 语义。

关于c++ - 当 vector 增长时如何强制执行 move 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8001823/

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