草庐IT

nothrow_move_constructible

全部标签

c++ - 既然我们已经有了 move 语义,那么专门化 std::swap 了吗?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Movesemantics==customswapfunctionobsolete?这就是std::swap在C++11中的样子:templatevoidswap(T&x,T&y){Tz=std::move(x);x=std::move(y);y=std::move(z);}我是否仍然需要为我自己的类型专门化std::swap,或者std::swap是否尽可能高效,前提是我的类定义当然是move构造函数和move赋值运算符? 最佳答案 std::swap的特

c++ - 新 (std::nothrow) 与 try/catch block 中的新

我在学习new之后做了一些研究,不像我习惯的malloc(),分配失败时不会返回NULL,发现有两种不同的方式检查new是否成功。这两种方式是:try{ptr=newint[1024];}catch(std::bad_alloc&exc){assert();};和ptr=new(std::nothrow)int[1024];if(ptr==NULL)assert();我相信这两种方法可以实现相同的目标,(当然,如果我错了,请纠正我!),所以我的问题是:这是检查new是否成功的更好选择,完全基于可读性、可维护性和性能,同时忽略事实上的c++编程约定。 最佳答案

c++ - C/C++ : How to use the do-while(0); construct without compiler warnings like C4127?

我经常在我的#defines中使用do-while(0)结构,原因描述为inthisanswer。.此外,我正在尝试使用编译器的尽可能高的警告级别来捕捉更多潜在问题,并使我的代码更加健壮和跨平台。所以我通常将-Wall与gcc和/Wall与MSVC一起使用。不幸的是,MSVC提示do-while(0)构造:foo.c(36):warningC4127:conditionalexpressionisconstant我应该怎么处理这个警告?只是对所有文件全局禁用它?对我来说这似乎不是一个好主意。 最佳答案 总结:在这种特殊情况下,此警告

c++ - 在派生对象上 move 构造函数

如果派生对象具有move构造函数,并且基对象也具有move语义,那么从派生对象move构造函数调用基对象move构造函数的正确方法是什么?我首先尝试了最明显的事情:Derived(Derived&&rval):Base(rval){}但是,这似乎最终调用了Base对象的复制构造函数。然后我在这里明确地尝试使用std::move,如下所示:Derived(Derived&&rval):Base(std::move(rval)){}这行得通,但我很困惑为什么它是必要的。我认为std::move只是返回一个右值引用。但是由于在这个例子中rval已经是一个右值引用,所以对std::move的调

c++ - STL vector : Moving all elements of a vector

我有两个STLvectorA和B,我想清除A的所有元素并移动的所有元素>B到A然后清除B。简单地说,我想这样做:std::vectorA;std::vectorB;....A=B;B.clear();由于B可能很长,因此需要k*O(N)来执行此操作,其中k是一个常量,N是max(size_of(A),size_of(B))。我想知道是否有更有效的方法来做到这一点。我能想到的一件事是将A和B定义为指针,然后在恒定时间内复制指针并清除B。 最佳答案 使用C++11,就这么简单:A=std::move(B);现在A包含以前由B持有的元素,

c++ - 为什么 C++20 中的 std::move 不是 [[nodiscard]]?

我最近阅读了C++17中的[[nodiscard]],据我了解,这是一项新功能(按契约(Contract)设计?),它迫使您使用return值(value)。这对于像std::launder(从C++20开始没有丢弃)这样的有争议的函数是有意义的,但我想知道为什么std::move在C中没有像这样定义++17/20。你知道一个很好的理由还是因为C++20还没有最终确定? 最佳答案 自VS201715.6以来,MSVC标准库团队继续添加了数千个[[nodiscard]]实例,并报告说它取得了巨大的成功(在发现大量错误和不会产生用户投诉

c++ - 为什么 std::move 会阻止 RVO(返回值优化)?

在许多情况下,当从函数返回一个局部变量时,RVO(返回值优化)会起作用。但是,我认为显式使用std::move至少会在RVO不执行move时强制执行发生,但在可能的情况下仍会应用RVO。然而,似乎并非如此。#include"iostream"classHeavyWeight{public:HeavyWeight(){std::cout我用VC++11和GCC4.71测试了这段代码,调试和发布(-O2)配置。复制ctor永远不会被调用。movector仅在调试配置中由VC++11调用。实际上,特别是这些编译器似乎一切都很好,但据我所知,RVO是可选的。但是,如果我明确使用move:Hea

c++ - move 语义和函数顺序评估

假设我有以下内容:#includestructA{intx;};classB{B(intx,std::unique_ptra);};classC:publicB{C(std::unique_ptra):B(a->x,std::move(a)){}};如果我正确理解有关“函数参数的未指定顺序”的C++规则,则此代码是不安全的。如果B的构造函数的第二个参数首先使用move构造函数构造,那么a现在包含一个nullptr和表达式a->x将触发未定义的行为(可能是段错误)。如果首先构造第一个参数,那么一切都会按预期工作。如果这是一个普通的函数调用,我们可以创建一个临时的:autox=a->xBb

c++ - std::function 的仅 move 版本

因为std::function是可复制的,标准要求用于构造它的可调用对象也是可复制的:n337(20.8.11.2.1)templatefunction(Ff);Requires:FshallbeCopyConstructible.fshallbeCallable(20.8.11.2)forargumenttypesArgTypesandreturntypeR.ThecopyconstructoranddestructorofAshallnotthrowexceptions.`这意味着不可能形成std::function来自不可复制的绑定(bind)对象或捕获仅move类型的lambd

c++ - 为什么有些人使用交换进行 move 分配?

例如,stdlibc++具有以下内容:unique_lock&operator=(unique_lock&&__u){if(_M_owns)unlock();unique_lock(std::move(__u)).swap(*this);__u._M_device=0;__u._M_owns=false;return*this;}为什么不直接将两个__u成员分配给*this呢?交换是否意味着__u被分配了*this成员,只是后来分配了0和false......在这种情况下,交换正在做不必要的工作。我错过了什么?(unique_lock::swap只是对每个成员执行std::swap)