NoS*_*tAl 8 c++ move-semantics c++11 c++14
我知道shared_ptr
,在相同类型的构造函数中用作RVR参数后unique_ptr
,weak_ptr
保证是空的,但我不知道标准是否为std::
我提到的其他类型指定了这个.
请注意,我知道移动后的元素保持有效但未指定的状态,我在这里感兴趣的是指定了哪些类型的状态.
Col*_*mbo 10
从"空"状态的对象移动的类型是智能指针,锁([thread.lock.unique.cons]/21,[thread.lock.shared.cons]/21),文件流([filebuf.cons] /(4.2) ),期货([futures.unique_future] /(8.2) ,[futures.shared_future]/10),承诺([futures.promise]/6),包装任务([futures.task]/7),线程([thread.thread.constr]/10),...
相比之下,带有未指定值的移动对象的模板是function
([func.wrap.func.con]/6),basic_regex
([re.regex.construct]/13),basic_string
([string.cons]/2),集装箱...
根据经验:具有共享引用语义的仅移动类型或类型使其移动对象处于空状态.所有其他类型都保留未指定的值.
仅移动类型(其离开移动-从物体处于空的状态)是std::unique_lock
,std::thread
,std::promise
,std::packaged_task
,std::future
,basic_filebuf
,std::basic_ifstream
,std::basic_ofstream
,std::basic_fstream
,std::shared_lock
和std::unique_ptr
.
与共享引用语义类型是std::shared_future
,当然std::shared_ptr
和std::weak_ptr
.这些也使他们移动的对象也处于空状态.
当我浏览标准库时,我发现std::stringstream
它的仅输入和仅输出兄弟(std::istringstream
和std::ostringstream
)是一个值得注意的例外.这些类是仅移动的,但在移动构造时没有任何关于移动对象的信息.因此,适用但未指定的规则适用.如你所见,这只是一个经验法则,而不是100%总是正确的.
归档时间: |
|
查看次数: |
357 次 |
最近记录: |