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%总是正确的.