提问人:SupAl 提问时间:9/12/2023 更新时间:9/12/2023 访问量:63
std::move 是否保证 vector.data() 不会改变?
Does std::move guarantee vector.data() does not change?
问:
请考虑以下代码:
#include <vector>
#include <utility>
#include <cstdint>
#include <bit>
template <typename T>
std::pair<std::vector<uint8_t>, T*> create_data_vec()
{
std::vector<uint8_t> data(sizeof(T));
auto ptr = std::bit_cast<T*>(data.data());
return {std::move(data), ptr};
}
在 C++20 中,是否保证返回后指向相同的数据?
我在 gcc 11.3 上测试了这一点,它成立了,但标准能保证吗?ptr
示例:https://godbolt.org/z/bG3rda3Ws
请注意,这不是最终代码。还有一些放置新的东西,所以这只是一个最小的工作示例。
答:
3赞
Jarod42
9/12/2023
#1
从 https://en.cppreference.com/w/cpp/container/vector/vector#Notes
在容器移动构造(重载 (8))之后,对其他的引用、指针和迭代器(结束迭代器除外)仍然有效,但引用现在位于 中的元素。当前标准通过 [container.reqmts]/67 中的一揽子声明做出此保证,并且正在考虑通过 LWG 问题 2321 提供更直接的保证。
*this
所以是的,这是有保证的。
评论
0赞
Sam Varshavchik
9/12/2023
“保持有效,但引用现在在 ”中没有提及的元素。它对移至(和移出)有效,但我看不出有任何保证,无论如何,它不会改变。*this
ptr()
*this
0赞
Jarod42
9/12/2023
@SamVarshavchik:不确定你的意思。“”现在是指返回的 .data.data()
vector.data()
0赞
SupAl
9/12/2023
@Jarod42,谢谢。这正是我想要的。下次发布前会阅读 CTOR 文档:)
评论
auto ptr = new (data.data()) T{};