C++标准是否保证std::vector等标准库类型的移动语义生效?
C++ std::vector移动语义的标准保障说明
代码示例运行结果判定
你给出的代码片段:
std::vector<int> myVec; int *myPtr = myVec.data(); std::vector<int> otherVec = std::move(myVec); int *otherPtr = otherVec.data(); bool check = myPtr == otherPtr;
在使用符合C++11及以上版本标准的编译器和标准库的前提下,check的值一定为true,核心依据如下:
- C++标准强制要求
std::vector的移动构造函数、移动赋值运算符的时间复杂度为O(1),深拷贝元素的实现方式时间复杂度为O(n),完全不符合标准要求,因此合规实现不可能用拷贝代替移动。 - 移动操作的本质是转移原容器底层的堆内存所有权,不会复制、移动内部存储的元素,原
myVec持有的内存地址会完整转移到otherVec中,因此两者的data()返回的指针必然相等。 - 移动完成后原
myVec会处于合法但未指定的状态,通常表现为空容器,但无论原容器后续状态如何,都不会改变内存地址已经转移的事实。
注:上述结论针对移动构造场景,移动赋值场景如果涉及不支持传播的自定义分配器,可能存在例外,但常规默认分配器场景下移动赋值也符合上述规则
移动构造实现强制要求
不存在合规标准库未实现std::vector移动构造的情况,相关规则如下:
- C++11是第一个正式引入移动语义的标准版本,从该版本开始,标准明确要求所有标准库容器(包括
std::vector)必须实现移动构造函数、移动赋值运算符。 - 只有当你将编译器的语言标准指定为C03及更早版本时,才会没有移动语义支持,此时
std::move会退化成立即数转换,触发拷贝构造,check会返回false,但这种情况不属于符合C11及以上标准的实现范畴。
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

