草庐IT

c++ - 返回成员变量时如何利用 move 语义?

我正在实现一个构建uint8_tvector的工厂类。我希望能够在返回结果vector时利用move语义。这似乎可行,但我不确定这是完成我想要的事情的正确方法。我已经看到很多关于如何将返回的自动变量视为右值并使用调用代码的move构造函数的示例,但在我的示例中,返回的对象是一个成员。我知道如果调用者将返回值放入move构造函数中,成员将丢失其内容-这正是我想要的。我是这样写的:#include#include#includeclassFactory{public:std::vector_data;Factory(std::size_tsize):_data(size,0){}voidb

c++ - 为什么不调用 move 构造函数?

这个问题在这里已经有了答案:Whatarecopyelisionandreturnvalueoptimization?(5个答案)Copyconstructornotcalled?(2个答案)关闭6年前。据我了解,move构造函数将在创建临时对象时调用。这里getA()函数返回一个临时对象,但我的程序没有打印来自move构造函数的消息:#includeusingnamespacestd;classA{public:A(){cout

c++ - 复制省略 : move constructor not called when using ternary expression in return statement?

考虑以下示例:#includeclassobject{public:object(){printf("constructor\n");}object(constobject&){printf("copyconstructor\n");}object(object&&){printf("moveconstructor\n");}};staticobjectcreate_object(){objecta;objectb;volatileinti=1;//With#if0,object'scopyconstructoriscalled;otherwise,itsmoveconstructor

c++ - 如何根据 is_nothrow_move_constructible<T> 声明包装类型 X<T> noexcept 的移动构造函数?

假设我有一个包装类型templatestructX{/*..*/};而且我不能只是X(X&&)=default因为我必须在那里做一些重要的事情。但是,我希望它是noexcept但前提是T(T&&)是noexcept。这可以使用::std::is_nothrow_move_constructible进行测试。我不知道如何根据constexpr有条件地启用构造函数的一个版本或另一个版本。我想可能有一种使用SFINAE的方法,但我不知道如何将其应用于ctors。 最佳答案 noexcept说明符接受任何bool常量表达式,因此您可以直接检

c++ - 无论如何有一个 valgrind 消息 "Conditional jump or move depends on uninitialized value"可以是所谓的 'false positive'

我在这里找到的大多数问题都提供一段代码,并由指出实际错误的人回答。我的问题是关于一般未初始化值的条件跳转。我可以理解,如果确定此分配仅完成一次并且在程序的生命周期内可能需要,则不必在程序结束时清理一block内存。据我所知,当程序终止时,GType系统会留下大量未释放的内存。这些未释放的block可以被视为“误报”。但是“有条件的跳跃或移动未初始化的值”会是误报吗?我唯一能想出的是有人通过读取随机地址来实现(坏的)随机函数(其中随机地址本身是棘手的部分;)。另一个例子可能是硬件映射到内存的一部分然后被读取,但这主要是由驱动程序而不是由普通用户应用程序完成的。是否有任何其他示例(最好是C

c++ - 为什么 std::move 需要前向引用?

std::move的实现基本上是这样的:templatetypenamestd::remove_reference::type&&move(T&&t){returnstatic_cast::type&&>(t);}请注意,std::move的参数是一个通用引用(也称为转发引用,但我们这里不转发)。也就是说,您可以std::move左值和右值:std::stringa,b,c;//...foo(std::move(a));//fine,aisanlvaluefoo(std::move(b+c));//nonsense,b+cisalreadyanrvalue但既然std::move的全部

c++ - 在这里真的有必要将 std::move 放在 lambda 中吗?

我真的必须将std::move调用封装在lambda中吗?std::listsrcData=GetData();//implementationnotimportantstd::vectordstData;dstData.reserve(srcData.size());std::transform(std::begin(srcData),std::end(srcData),std::back_inserter(dstData),[](std::wstring&guid)->std::wstring{returnstd::move(guid);});srcData.clear();我对l

c++ - std::move 模板参数是如何推导出来的?

假设我们有:foo(A&&a);如果你这样做Aa;foo(a);它不会编译并且提示不能将左值绑定(bind)到A&&。很好。然而,鉴于std::move的签名,templatetypenameremove_reference::type&&std::move(T&&a);看起来它需要一个右值引用,就像在foo中一样,为什么下面的代码符合要求?Aa;std::move(a);a不是左值吗?此外,据说编译将实例化:typenameremove_reference::type&&std::move(A&&&a);我不明白为什么不是:typenameremove_reference::type

c++ - 在 vector 中使用没有拷贝且没有 noexcept move 构造函数的对象。到底是什么坏了,我该如何确认?

我检查了很多moveconstructor/vector/noexcept线程,但我仍然不确定当事情应该出错时实际发生了什么。我无法按预期产生错误,所以要么我的小测试有误,要么我对问题的理解有误。我正在使用BufferTrio对象的vector,它定义了一个noexcept(false)move构造函数,并删除了所有其他构造函数/赋值运算符,这样就没有什么可以回退到:BufferTrio(constBufferTrio&)=delete;BufferTrio&operator=(constBufferTrio&)=delete;BufferTrio&operator=(BufferTr

c++ - 使用 BeginPaint/EndPain 而不是 GetDC/ReleaseDC 来响应 WM_PAINT 消息有什么特别之处吗?

可以使用GetDC/ReleaseDC在窗口客户区绘制。但是为了响应WM_PAINT消息,必须使用BeginPaint/EndPaint。这有什么特别的吗? 最佳答案 当窗口的一部分需要更新时,会发出WM_PAINT消息。通过指定BeginPaint/EndPaint(),您告诉gdi您实际上正在做那项工作。如果您不为指定区域调用BeginPaint(),WM_PAINT消息将一直生成,直到有人实际更新它为止。函数给你一个DC,就是因为方便。在内部BeginPaint()/EndPaint()可能调用GetDC()/ReleaseD