在从 std::vector 移动的上调用 .clear()、.shrink_to_fit()、.empty() 是否合
is it legal to call .clear(), .shrink_to_fit(), .empty() on a moved from std::vector?
作为这两个问题的特定子案例:
移自向量总是空的吗?
我能对移出对象执行哪些操作?
人们想知道:在为移动的std::vector
上调用.clear()
、.chrink_to_fit()
、.empty()
是否合法?我可以问push_back()
但我不知道这会给出什么,因为依赖从向量移动为空是不安全的。
显而易见的是,销毁以及来自新载体的分配是合法的。
std::vector<int> fs = getVec();
giveVecs(std::move(fs));
fs.empty(); // 1.?
fs.size(); // 2.?
fs.shrink_to_fit(); // 3.?
fs.clear(); // //4. ?
fs = {} ; // 5. Should be fine, but weird when we have .clear()
fs.push_back(1); //
编辑:
我应该澄清一下,有些操作确实有先决条件:因此,(正如您可以在其他问题中读到的那样(,并非所有操作在移动后都是合法的。
因此,我的问题可以这样重申:三项行动中的任何一项是否有任何先决条件?问题的一个来源可能是与移动对象的分配器相关的细则。
是的。移动对象会使其处于未指定但有效的状态。
所以你可以调用clear
、shrink_to_fit
、empty
、push_back
等。
但是您可能应该从clear
开始,因为未指定的限定符:)。
合法但未指定的状态可能真的是空的(使用内部缓冲区移动(;它可能是移动到容器的内容(使用交换(,可能是它仍然有移动到容器的内存;但所有元素都被破坏了,size((报告零(swap&clear(((。
或者可能是我没有想到的任何其他事情,但它们都应该看起来像容器的有效状态。
移动的对象处于有效但未指定的状态。 通过谷歌的魔力,该标准的相关部分是 17.6.5.15 [lib.types.movedfrom]
C++标准库中定义的类型的对象可以从 (12.8( 中移动。移动操作可以显式指定或隐式生成。除非另有说明,否则此类移出对象应处于有效但未指定的状态。
至于什么是合法的move
std::vector
,这可能取决于其他函数对它做了什么。 我的预感是,对于大多数实现,您几乎可以做任何您想做的事情,但我不相信这在任何地方都能保证。 所有成员函数都可能失败(有效可能意味着它们不会崩溃,但对象实际上保持无用(。
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- "no matching function for call to 'Vector::Vector'"错误
- vector<vector<double>> to mxArray using memcpy
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 当覆盖存在时调用基本虚拟"binded to object"函数
- OpenGL VBO Indexing ( How to compute Index Array)
- 为什么我会" void value not ignored as it ought to be"?
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")