在移动构造函数中用作arg后,哪些std类型保证为空/ null

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),集装箱...

  • 可怜的`basic_string`,不被视为容器.*嗅出*. (2认同)

Ral*_*zky 6

经验法则

根据经验:具有共享引用语义的仅移动类型或类型使其移动对象处于空状态.所有其他类型都保留未指定的值.

仅移动类型

仅移动类型(其离开移动-从物体处于空的状态)是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_lockstd::unique_ptr.

共享引用语义

与共享引用语义类型是std::shared_future,当然std::shared_ptrstd::weak_ptr.这些也使他们移动的对象也处于空状态.

一个值得注意的例外

当我浏览标准库时,我发现std::stringstream它的仅输入和仅输出兄弟(std::istringstreamstd::ostringstream)是一个值得注意的例外.这些类是仅移动的,但在移动构造时没有任何关于移动对象的信息.因此,适用但未指定的规则适用.如你所见,这只是一个经验法则,而不是100%总是正确的.