草庐IT

nothrow_move_constructible

全部标签

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++ - 为什么 move 语义和 RVO 都没有按预期工作?

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

c++ - 指向堆栈分配对象和 move 构造的指针

注意:这是对aquestion的完整改写我前一阵子发帖了。如果您发现它们是重复的,请关闭另一个。我的问题很普遍,但似乎可以根据具体的简单示例更容易地解释它。所以想象一下,我想模拟办公室的电力消耗。假设只有灯和暖气。classSimulation{public:Simulation(Timeconst&t,doublelightMaxPower,doubleheatingMaxPower):time(t),light(&time,lightMaxPower),heating(&time,heatingMaxPower){}private:Timetime;//Note:stack-all

c++ - 如何将 `std::vector` 成员变量 move 到方法的调用者?

请考虑以下代码classA{public:A(std::size_td):m_v(d)std::vectoroperator()(){returnm_v;}private:std::vectorm_v;};我想movem_v给operator()的来电者而不是复制它。我需要做什么?简单地写returnstd::move(m_v)并将返回类型更改为std::vector&&? 最佳答案 写returnstd::move(m_v)就够了。 关于c++-如何将`std::vector`成员变量

c++ - 为什么我需要在临时 dynamic_bitset 上调用 std::move?

我在这里讲一个冗长的背景故事,因为除了直接回答之外,我还想知道我导致这种情况的推理是否正确。我有一个接受dynamic_bitset的函数参数(来自Boost.dynamic_bitset)。说它看起来像这样。voidfoo(boost::dynamic_bitsetdb){//dostuff}碰巧它只被临时调用,从构造函数构建,如foo(boost::dynamic_bitset{5}.set())(使用5位位集调用所有位集)。我的位集只有少量的位(少于32)。所以起初,我想“我只是按值传递它;拷贝比指针小。”但后来我想“它是动态的,所以它必须在堆上分配空间。我想避免不必要的分配和释

c++ - 使用 std::move() 创建右值引用变量是否有任何用处。 [C++]

有人可以帮助修正我对std::move的理解吗?我认为如果右值引用超出范围,如果它是使用std::move运算符分配的,它所引用的内容也会超出范围。为什么下面的代码不是这种情况?#includeusingnamespacestd;intmain(){stringone="1-one";stringtwo="2-two";{//notasexpectedstring&lValRef=one;string&&rValRef=std::move(two);stringnewS(rValRef);}cout你可以摆弄它here.我一直认为使用std::move是一种让对象处于“可删除状态”的方

c++ - 为什么 move 返回一个右值引用参数需要用 std::move() 包装它?

我正在阅读EffectiveModernC++Item25,第172页,它有一个例子来证明,如果你想移动返回一个右值引用参数,你需要用std::move(param)包装它。由于参数本身总是一个左值,如果没有std::move(),它将被复制返回。我不明白。如果std::move(param)只是将它接收的参数转换为右值引用,那么当param已经是右值引用时有什么区别?像下面的代码:#include#include#includetemplateclassTD;classWidget{public:explicitWidget(conststd::string&name):name(n

c++ - 在容器之间 move 对象而无需复制开销

我有一个对象指针的全局vector,我正在生成相同类型的对象并将它们放入forloop内的vector中。即:vectorptrVector;vectorobjVector;for(;;){getElements(objVector);calcualte_with(objVector);objVector.clear();}我的问题是如何在不复制开销的情况下将objVector中的对象“move”到ptrVector中? 最佳答案 简而言之,您不能使用C++98/C++03。objVector中的对象由objVector分配和拥有,

c++ - 编译器用来决定 move 操作是否安全的标准是什么?

给定以下代码(http://liveworkspace.org/code/5oact):classFoo{public:Foo(){log(__PRETTY_FUNCTION__);}Foo(constFoo&other){log(__PRETTY_FUNCTION__);}Foo&operator=(constFoo&other){log(__PRETTY_FUNCTION__);return*this;}Foo(Foo&&other)noexcept{log(__PRETTY_FUNCTION__);}Foo&operator=(Foo&&other)noexcept{log(__