std::move 是否保证 vector.data() 不会改变?

Does std::move guarantee vector.data() does not change?

提问人:SupAl 提问时间:9/12/2023 更新时间:9/12/2023 访问量:63

问:

请考虑以下代码:

#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

请注意,这不是最终代码。还有一些放置新的东西,所以这只是一个最小的工作示例。

C++ stdvector 移动语义

评论

1赞 Red.Wave 9/12/2023
可能的重复项:stackoverflow.com/questions/76739542/...
0赞 Jarod42 9/12/2023
[加时赛]应该是吗?auto ptr = new (data.data()) T{};
0赞 SupAl 9/12/2023
@Jarod42,如前所述,是的。在原始代码中,我这样做了,但它与问题无关。

答:

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
“保持有效,但引用现在在 ”中没有提及的元素。它对移至(和移出)有效,但我看不出有任何保证,无论如何,它不会改变。*thisptr()*this
0赞 Jarod42 9/12/2023
@SamVarshavchik:不确定你的意思。“”现在是指返回的 .data.data()vector.data()
0赞 SupAl 9/12/2023
@Jarod42,谢谢。这正是我想要的。下次发布前会阅读 CTOR 文档:)