草庐IT

btn-move-forward

全部标签

c++ - 为什么使用 std::forward<T> 而不是 static_cast<T&&>

当给出以下结构的代码时templatevoidfoo(Args&&...args){...}我经常看到库代码使用static_cast在用于参数转发的函数中。通常,这样做的理由是使用static_cast避免不必要的模板实例化。给定语言的引用折叠和模板推导规则。我们通过static_cast获得完美的转发,此声明的证明如下(在误差范围内,我希望答案能启发)当给定右值引用时(或为了完整性-没有像thisexample中的引用限定),这会折叠引用,结果是一个右值。使用的规则是&&&&->&&(规则1以上)当给定左值引用时,这会折叠引用以使结果是左值。这里使用的规则是&&&->&(规则2以上

c++ - Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语?

如thisanswer中所述,copy-and-swap习语的实现方式如下:classMyClass{private:BigClassdata;UnmovableClass*dataPtr;public:MyClass():data(),dataPtr(newUnmovableClass){}MyClass(constMyClass&other):data(other.data),dataPtr(newUnmovableClass(*other.dataPtr)){}MyClass(MyClass&&other):data(std::move(other.data)),dataPtr(

c++ - Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语?

如thisanswer中所述,copy-and-swap习语的实现方式如下:classMyClass{private:BigClassdata;UnmovableClass*dataPtr;public:MyClass():data(),dataPtr(newUnmovableClass){}MyClass(constMyClass&other):data(other.data),dataPtr(newUnmovableClass(*other.dataPtr)){}MyClass(MyClass&&other):data(std::move(other.data)),dataPtr(

c++ - 为什么 std::move 之后的析构函数调用是必要的?

在C++编程语言第4版中有一个vector实现的示例,请参阅消息末尾的相关代码。uninitialized_move()通过将新的T对象从旧的内存区域中移出来将它们初始化到新的内存区域中。然后它调用原始T对象(即移出对象)的析构函数。为什么在这种情况下需要调用析构函数?这里是我的不完全理解:move一个对象是指将被move对象所拥有的资源的所有权转移到被move对象。move对象中的剩余部分是不需要销毁的内置类型的一些可能成员,当vector_baseb超出范围时(在reserve()内),它们将被释放,在swap()调用之后)。被move对象中的所有指针都将被放置到nullptr或者

c++ - 为什么 std::move 之后的析构函数调用是必要的?

在C++编程语言第4版中有一个vector实现的示例,请参阅消息末尾的相关代码。uninitialized_move()通过将新的T对象从旧的内存区域中移出来将它们初始化到新的内存区域中。然后它调用原始T对象(即移出对象)的析构函数。为什么在这种情况下需要调用析构函数?这里是我的不完全理解:move一个对象是指将被move对象所拥有的资源的所有权转移到被move对象。move对象中的剩余部分是不需要销毁的内置类型的一些可能成员,当vector_baseb超出范围时(在reserve()内),它们将被释放,在swap()调用之后)。被move对象中的所有指针都将被放置到nullptr或者

c++ - 我可以将 std::map 的内容 move 分配到另一个 std::map 吗?

是否可以通过使用move语义将临时std::maptemp的内容插入到另一个std::mapm中,这样来自临时不被复制并被重复使用?假设有:std::maptemp;std::mapm;将值从temp复制到m的一种方法是:m.insert(temp.begin(),temp.end());我如何movetemp元素到m,而不是复制? 最佳答案 提示:先阅读更新!当前的C++11标准和C++14草案没有提供成员函数来启用此功能。正如lavr建议的那样,您仍然可以编写m.insert(make_move_iterator(begin(t

c++ - 我可以将 std::map 的内容 move 分配到另一个 std::map 吗?

是否可以通过使用move语义将临时std::maptemp的内容插入到另一个std::mapm中,这样来自临时不被复制并被重复使用?假设有:std::maptemp;std::mapm;将值从temp复制到m的一种方法是:m.insert(temp.begin(),temp.end());我如何movetemp元素到m,而不是复制? 最佳答案 提示:先阅读更新!当前的C++11标准和C++14草案没有提供成员函数来启用此功能。正如lavr建议的那样,您仍然可以编写m.insert(make_move_iterator(begin(t

c++ - Initializer-list-构造一个不可复制(但可 move )对象的 vector

可以将不可复制但可move类型的右值push_back放入该类型的vector中:#includestructS{S(int);S(S&&);};intmain(){std::vectorv;v.push_back(S(1));v.push_back(S(2));v.push_back(S(3));}但是,当我尝试使用相同的右值初始化vector列表时,我收到有关需要复制构造函数的错误:#includestructS{S(int);S(S&&);};intmain(){std::vectorv={S(1),S(2),S(3)};}我在使用GCC4.7时遇到以下错误:Infileincl

c++ - Initializer-list-构造一个不可复制(但可 move )对象的 vector

可以将不可复制但可move类型的右值push_back放入该类型的vector中:#includestructS{S(int);S(S&&);};intmain(){std::vectorv;v.push_back(S(1));v.push_back(S(2));v.push_back(S(3));}但是,当我尝试使用相同的右值初始化vector列表时,我收到有关需要复制构造函数的错误:#includestructS{S(int);S(S&&);};intmain(){std::vectorv={S(1),S(2),S(3)};}我在使用GCC4.7时遇到以下错误:Infileincl

c++ - move 构造函数在 C++ 中调用了两次吗?

看看这段代码:classFoo{public:stringname;Foo(stringn):name{n}{cout"输出是:[1]CTOR(Hello)[2]MOVECTOR(movingHellointo->)[3]DTORofHello[4]MOVECTOR(movingHello###into->)[5]DTORofHello###[6]NOWtwoISEQUALTO:Hello######[7]DTORofHello######重要提示:出于测试目的,我使用-fno-elide-constructors禁用了复制省略优化。函数f()构造一个临时[1]并返回它调用move构造