jjzjj

c++ - 在破坏的对象上 move 构造函数?

我有一段代码#includeclassA{public:A(){std::cout我试着运行它,输出结果是DefaultconstructorDestructorMoveconstructorDestructor我的问题是为什么析构函数在move的构造函数之前被调用?这是否也意味着第二个对象是用销毁的值构造的? 最佳答案 从A&&f()返回局部变量与A&f()有同样的问题。它们都是引用。在main()中构造a时,局部变量已被销毁。这会导致引用已销毁的实例,从而导致未定义的行为。如果你想将A()从f()move到main中的a只需返回

c++ - 自定义转换运算符的 Clang 歧义

我一直在开发一种适配器类,当我在clang下遇到问题。当定义了左值引用和右值引用的转换运算符时,您会在尝试从您的类中移出时遇到歧义编译错误(当这样的代码应该没问题时,如operatorconstT&()const&仅允许用于左值AFAIK)。我用简单的例子重现了错误:#includeclassStringDecorator{public:StringDecorator():m_string("Stringdatahere"){}operatorconststd::string&()const&//lvalueonly{returnm_string;}operatorstd::strin

c++ - 在派生类到基类的转换中 move 语义

考虑以下类Buffer,它包含一个std::vector对象:#include#includeclassBuffer{std::vectorbuf_;protected:Buffer(std::byteval):buf_(1024,val){}};现在,考虑下面的函数make_zeroed_buffer()。BufferBuilder类是一个localclass公开派生自Buffer。它的目的是创建Buffer对象。Buffermake_zeroed_buffer(){structBufferBuilder:Buffer{BufferBuilder():Buffer(std::byte

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

我查看了std::move_iterator的STL源代码并发现它返回Iterator::value_type&&.当Iterator::reference时,这会导致不正确的行为是右值,与Iterator::value_type&不同.我有一个带有代理对象的类reference(如std::vector),它可以隐式转换为value_type.普通迭代器只是取消对这个代理的引用(输入迭代器要求允许这样做),但是std::move_iterator调用转换为value_type带有开销,然后返回对创建的临时对象的悬空引用。std::move_iterator仍然适用于std::vect

c++ - 自动生成的 move 构造函数导致非法行为

我问aquestionaboutmoveconstructors,但我尚未接受答案,因为即使在我开始对其他方面有所了解时,我对问题的某些方面也感到更加困惑。特别是,我发现了一个令人惊讶的情况,其中g++和clang++都生成不正确的move-constructor。问题总结g++和clang++显然违反了以下规则:明确定义析构函数时,不生成move-constructors。为什么?这是一个错误,还是我误会发生了什么?为了正确起见,这些(可能是非法的)move构造函数应使RHS指针成员无效,但它们不会无效。为什么不?看来,避免不良行为的唯一方法是为每个在其析构函数中使用delete的类

c++ - Pimpl with unique_ptr : Why do I have to move definition of constructor of interface to ".cpp"?

只要我不将构造函数(B)的定义移动到标题B.h中,代码就可以工作。B.hclassImp;//imp;B();//B.cpp#include"B.h"#include"Imp.h"B::B(){}~B::B(){}Imp.hclassImp{};Main.cpp(编译我)#include"B.h"Error:deletionofpointertoincompletetypeError:useofundefinedtype'Imp'C2027我能以某种方式理解必须将析构函数移动到.cpp,因为可能会调用Imp的解构:-deletepointer-of-Imp;//somethinglik

c++ - 编译器什么时候不能使用 RVO 或 NRVO?

当编译器不能使用RVO时,move语义很有用。和NRVO.但是在什么情况下编译器不能使用这些特性呢? 最佳答案 答案是它取决于编译器和情况。例如。控制流分支可能会混淆优化器。Wikipedia举个例子:#includestd::stringf(boolcond=false){std::stringfirst("first");std::stringsecond("second");//thefunctionmayreturnoneoftwonamedobjects//dependingonitsargument.RVOmightno

c++ - 使用哪个 : move assignment operator vs copy assignment operator

我似乎不明白为什么要使用移动赋值运算符:CLASSA&operator=(CLASSA&&other);//moveassignmentoperator结束了,复制赋值运算符:CLASSA&operator=(CLASSAother);//copyassignmentoperator移动赋值运算符仅采用r值引用,例如CLASSAa1,a2,a3;a1=a2+a3;在复制赋值运算符中,other可以是使用复制构造函数或移动构造函数的构造函数(如果other是用右值初始化的,它可以是移动构造的——如果move-constructor定义了——)。如果它是copy-constructed,我

c++ - 通过 `&&` 传递的参数对非构造函数有用吗?

一个人可能有一个函数voidsetData(std::stringarg);并通过setData(std::move(data));调用它,从而调用move构造函数,他会为voidsetData(std::string&&arg);做同样的事情(除了他会被迫将数据移入其中)。编译器不能决定是否对简单情况执行move,是否已经这样做了?所以我的问题是:不仅要为编译器而且要为通用代码(例如为其他开发人员创建的API成员)使用&&? 最佳答案 优化r值比较voidsetData(std::stringarg)和voidsetData(st

c++ - std::transform 和 move 语义

我正在使用Boost.Filesystem在目录中创建文件列表。我使用boost::filesystem::recursive_directory_iterator和std::copy将每个路径放入std::vector作为boost::filesystem::directory_entry对象。不过,我希望将文件作为std::strings输出,所以我执行了以下操作(\n以避免使用std::vectorbuffer;//filledwithpaths...std::vectorbuffer_native(buffer.size());//transformdirectory_entr