草庐IT

c++ - 右值参数如何工作?

所以我真的很惊讶地发现在这段代码中:voidAddLayer(shared_Layer_ptr&&pNewLayer_p){m_layers.push_back(pNewLayer_p);//*}被调用的push_back是“¶m”,而不是“&¶m”版本。m_layers是一个std::vector。由于pNewLayer_p是一个“&&”,我虽然它是一个该死的右值..我设法获得push_back(“&¶m”)调用的唯一方法是使用std::move:m_layers.push_back(std::move(pNewLayer_p));对我来说似乎是多余的,因为p

c++ - 实现 move 构造函数如何影响返回值优化?

考虑以下代码片段:#include#includeclassA{public:A(){std::cout它用g++和clang++编译得很好,输出是A::A()A::~A()在这种情况下,RVO似乎开始发挥作用。请注意,没有调用move构造函数。但是,如果从上面的代码中删除那个未使用的move构造函数,那么片段会变成这样:#include#includeclassA{public:A(){std::coutclang++和g++都拒绝编译它,因为类A的复制构造函数被标记为已删除,所以似乎没有发生RVO。如何删除未使用的move构造函数会导致这种情况? 最佳答

c++ - lambda 函数不是 throw_move_assignable 吗?

clang-cl(4.0.0-trunk)似乎认为是,而vc2015(update3)认为不是。此实现是否已定义或标准是否规定了lambda函数应如何在术语或nothrow和moveassignable中实现?#include#includetemplatevoidtest_nothrow_move_assignable(T&&){std::cout::value 最佳答案 这是clang错误。来自[expr.prim.lambda]:Theclosuretypeassociatedwithalambda-expressionhas

c++ - 为什么 std::allocator 要求 propagate_on_container_move_assignment 为真?

根据当前标准(20.7.9),std::allocator有一个成员propagate_on_container_move_assignment设置为true_type:templateclassallocator{public:typedefsize_tsize_type;typedefptrdiff_tdifference_type;typedefT*pointer;typedefconstT*const_pointer;typedefT&reference;typedefconstT&const_reference;typedefTvalue_type;templatestruc

c++ - 从 boost multi_index 数组中 move 元素

假设我有可move且不可复制的对象,并且我有带有random_access索引的boost多索引数组。我需要将我的对象移出数组前端,但我找不到任何方法可以在documentation中给我右值/左值引用.我只能看到front()给我不断的引用和pop_front()删除元素,但不返回任何东西。那么有没有办法将元素移出boostmulti-index呢? 最佳答案 添加到@sehe的回答中,下面显示了在您的可move类型不可默认构造的情况下如何修改代码:已编辑:更改代码以正确处理*extracted的破坏。已编辑:添加了std::un

c++ - 无法创建以 vector 为键和自定义类为值的 map

我创建了下面的抽象类来评估简单游戏的棋盘位置。抽象类被每个派生类覆盖,所以在game.h中只定义了评估函数我试图通过使用内存来提高我的程序的效率,但我无法让我的map正常工作。编译器对行results[board]=best抛出错误。此行试图将映射到当前棋盘(整数vector)的值设置为从该位置开始的最佳可能移动。Move是我创建的一个类,它只包含一个分数、一个要删除以制作下一个板的数字,以及要从中删除数字的索引(堆)。“results[board]=best”的编译器错误表示没有匹配的函数调用move::move()。我不明白这个错误,因为我不是要创建新的着法,只是存储当前的最佳着法

c++ - 编译器会在 setter 方法中自动应用 move 语义吗?

我想知道是否允许编译器在以下setter方法中自动使用wstring的move构造函数(无需显式调用std::move):voidSetString(std::wstringstr){m_str=str;//Willstrbemovedintom_strautomaticallyorisstd::move(str)needed?}从我读到的内容来看,似乎不允许编译器做出此决定,因为str是一个左值,但很明显,在这里使用move不会改变程序行为。除非move,是否会应用其他类型的复制省略? 最佳答案 [is]thecompiler[.

c++ - 为什么 list<unique_ptr> 中的 unique_ptr 的 std::move() 没有真正 move 它?

usingPtr=std::unique_ptr;Ptrf(boolarg){std::listlist;Ptrptr(newint(1));list.push_back(std::move(ptr));if(arg){Ptr&&obj1=std::move(list.front());//Here|obj1|and|list.front()|stillpointtothesamelocation!list.pop_front();returnstd::move(obj1);}else{Ptrobj2=std::move(list.front());list.pop_front();r

c++ - 并行命令模式

我想知道如何在保持性能的同时保证线程安全地使用命令模式。我有一个模拟,其中我执行了数百亿次迭代;性能至关重要。在这个模拟中,我有一堆Moves在我的模拟中对对象执行命令。基类如下所示:classMove{public:virtual~Move(){}//Performamove.virtualvoidPerform(Object&obj)=0;//Undoamove.virtualvoidUndo()=0;};我在Perform上传递对象的原因而不是构造函数,就像典型的命令模式一样,是我不能实例化一个新的Move对象每次迭代。相反,Move的具体实现会简单地采取Object,维护一个指

c++ - 为什么 move 语义和 RVO 都没有按预期工作?

我最近在我的方程求解器中偶然发现了一些奇怪的行为,这让我问自己是否真的了解move语义和RVO如何协同工作。有很多relatedquestions在这个论坛上,我也读过manygeneralexplanations对此。但我的问题似乎很具体,所以我希望有人能帮助我。涉及的结构总体上有点复杂,但至少可以分解为:structFoo{Bar*Elements;Foo(void):Elements(nullptr){cout现在让我们考虑以下短程序:intmain(){Fooa=Foo::Example();cout这些是我在运行这段代码之前的期望:Example方法实例化本地Foo对象,导致