c++11 - c++标准有关于处在moved状态的容器的说明吗?
黄舟
黄舟 2017-04-17 14:51:13
[C++讨论组]
std::string a = "xxx";
std::string b = std::move(a);
//这时候的a,处于什么状态呢
a = "bbbbb";//合法吗?

因为我实际用下来好像有点问题。所以我就想知道,在标准中,是怎么描述这个问题的。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
PHPz

C++11 21.4.3.17:
basic_string(basic_string&& str, const Allocator& alloc);
str is left in a valid state with an unspecified value.
因为a其实是左值,被转化为右值了,所以b会指向a的data()缓冲区。这个时候a就处于未定义状态,再访问a的值就不安全了。
不过a = "bbbbb"是合法的。
因为这个a重载了赋值运算符。
basic_string<charT,traits,Allocator>& operator=(const charT* s);
会返回一个
*this = basic_string<charT,traits,Allocator>(s)
相当于又构造了一个新的临时对象basic_string右值。它会拷贝"bbbbb"的值,这是a就指向新分配的缓冲区了,理应是没问题的。

黄舟

我觉得不会有什么问题,string毕竟是个字符串,看gcc自带的string实现是用swap实现的operator = (&&)
标准的意思是move之后是处于不确定的状态的
stl是保证move之后也应该处于一种的状态,不过string并不属于stl

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号