草庐IT

btn-move-forward

全部标签

c++ - 如何 move std::ostringstream 的底层字符串对象?

#include#includeusingnamespacestd;templatestringToString(constT&obj){ostringstreamoss;oss如何movestd::ostringstream的底层字符串对象? 最佳答案 标准说std::ostringstream::str()returnsacopy.避免这种复制的一种方法是实现另一个直接公开字符串缓冲区的std::streambuf派生类。Boost.IOStreams使这变得非常简单:#include#include#includenamesp

c++ - 需要一些帮助来理解 C++11 move 构造函数

这个问题在这里已经有了答案:Whatarecopyelisionandreturnvalueoptimization?(5个答案)关闭8年前。作为C++新手,我在理解C++11的新Move-Constructor时确实遇到了问题,我希望有人能解释我偶然发现的具体情况。让我们来看这个示例代码:#includeusingnamespacestd;classModel{public:intdata;Model(intdata):data(data){cout所以我创建了一个createModel函数,它应该返回一个模型作为临时右值,我想将它分配给一个左值。我不希望编译器创建Model对象的拷

c++ - 为什么在声明 move 操作时删除复制操作?

当类显式声明复制操作(即复制构造函数或复制赋值运算符)时,不会为该类声明move操作。但是当一个类显式声明一个move操作时,复制操作被声明为删除。为什么会存在这种不对称?为什么不直接指定如果声明了move操作,就不会声明复制操作?据我所知,不会有任何行为差异,也不需要对move和复制操作进行不对称处理。[对于喜欢引用标准的人来说,12.8/9和12.8/20中规定了有复制操作声明的类缺少move操作声明,有move操作声明的类有删除复制操作的规定在12.8/7和12.8/18中。] 最佳答案 当要move一个类但由于没有声明mov

c++ - 使用已被 std::move 到别处的变量时出现错误,或至少出现警告

这个:voidfoo(int&&r){std::cout如果我在move变量后不小心使用了它,是否没有办法告诉编译器给我一个错误(或警告)?我认为这会很方便。很多时候我发现自己像那样将变量move到其他地方,但后来我手动必须非常小心,以免以后不使用它们。现在这还没有造成任何问题,但谁知道呢……最好注意安全!也许存在一些预处理器技巧(或相当广泛可用的编译器扩展)来执行此操作?更现实的例子:structHugeStorage{std::vectorm_vec;HugeStorage(std::vectorvec):m_vec(std::move(vec)){}};structSmallSt

c++ - 在 std::vector 上调整大小不调用 move 构造函数

这个问题在这里已经有了答案:C++11rvaluereferencecallingcopyconstructortoo(4个答案)关闭7年前。我一直在研究std::vector以了解对象何时被构造、析构、复制构造和move构造。为此,我编写了以下程序#include#includeclassTest{public:Test(){std::couta(1);a.resize(3);return0;}当调整a的大小时,会发生重新分配。我的猜测是对象a[0]被move构造到新的a[0]。但是,对于libc++和libstdc++,似乎调用了复制构造函数而不是move构造函数。这种行为有什么原

c++ - 为什么 std::make_move_iterator 适用于 vector<string> 但不适用于 vector<int>

我期待std::make_move_iterator总是会move内容,但似乎不会。看起来是在vector中move元素但不在vector.请看下面的代码片段:#include#include#include#includevoidmoveIntVector(){std::coutv1;for(unsignedi=0;iv2(std::make_move_iterator(v1.begin()+5),std::make_move_iterator(v1.end()));std::coutv1;for(unsignedi=0;iv2(std::make_move_iterator(v1.

c++ - 为什么 C++11 的 move 构造函数/赋值运算符不按预期运行

#includeusingnamespacestd;structA{A(){cout我的预期输出应该是:A()A(A&&)~A()~A()然而,实际输出是:(C++编译器是:VisualStudio2012)A()~A()~A()这是VC++的错误吗?还是我的误会? 最佳答案 根据thisblogpost,VC++2012目前实现N2844+DR1138,但不是N3053.因此,编译器不会为您隐式生成move构造函数或赋值运算符。如果您添加显式默认值并将构造函数move到B,那么您将获得您期望的输出。

c++ - 为什么在超出容量时 resize() 会导致 vector 内容的复制而不是 move ?

这个问题在这里已经有了答案:Howtoenforcemovesemanticswhenavectorgrows?(3个答案)关闭9年前。下面给定类X(明确定义的特殊成员函数与本实验无关):structX{X(){}X(int){}X(Xconst&){std::cout以下程序创建了一个类型为X的对象vector,并调整它的大小以超出其容量并强制重新分配:#include#includeintmain(){std::vectorv(5);v.resize(v.capacity()+1);}由于X类提供了move构造函数,我希望vector的先前内容在重新分配后被move到新存储中。令人

c++ - 为什么要为 std::forward_list 拼接整个列表或线性范围?

将范围从一个列表拼接到另一个列表可以在常数时间内完成,但代价是使size()的复杂度呈线性。C++11改变了std::list的情况,要求size()为常数时间。例如,这破坏了gcc的实现,参见[C++0x]std::list::sizecomplexity.除了splice()范围外,还有什么其他原因size()不能成为常量时间在早期,C++03符合std::listimplementations?为什么拼接整个列表或范围是线性的std::forward_list?参见splice_after(),案例(1)和(3)。另见standarddraftN3485中的23.3.4.6for

c++ - 这种在 C++03 中模拟 move 语义的方法有多安全?

使用thisanswer,我发明了自己的基于swap的C++03模拟move语义的方法。首先,我检测move语义(即C++03的可用性):#if__cplusplus>=201103L||defined(__GXX_EXPERIMENTAL_CXX0X__)||\defined(_MSC_VER)&&_MSC_VER>=1600#defineHAS_MOVE_SEMANTICS1#elifdefined(__clang)#if__has_feature(cxx_rvalue_references)#defineHAS_MOVE_SEMANTICS1#else#defineHAS_MOV