草庐IT

c++ - 编译器不生成 move 构造函数

我试图了解move语义正在查看编译器生成的move构造函数(复制和赋值)。在ModernEffectiveC++中,ScottMeyers在第17项中说,如果没有声明显式复制构造函数,编译器将生成move构造函数,这将为non-static执行成员明智的move成员。为了确认这一点,我正在尝试以下代码:#include#includeusingnamespacestd;classA{private:std::stringstr;public:A():str("Initstring"){cout输出是:DefaultconstructorConstructorwithstringobj1

c++ - 我应该在移动构造函数/赋值运算符中使用 std::move 还是 std::forward?

除非我错了,否则似乎两者都可以正常工作-是否有最佳实践理由更喜欢一个而不是另一个?例子:structA{A(){}A(constA&){std::cout(right.x)){std::cout输出:---BTest---A(A&&)B(B&&)---CTest---A(A&&)C(C&&)---DTest---A(constA&)D(D&&) 最佳答案 问题是:那些真的是类的移动构造函数/赋值运算符吗?或者它们只是从您的眼角看起来像那样?structX{X(X&&);//movector#1templateX(T&&);//per

c++ - std::vector::erase() 不想 move

我有一个std::vector其中Foo是一个包含Foo(Foo&&)noexcept的类.向容器中添加对象完美无缺,但是使用std::vector::erase(iterator)删除它们不会,GCC4.7会尝试调用我已删除的赋值运算符。确切的错误信息是:错误:使用已删除的函数‘Foobar&Foobar::operator=(constFoobar&)编辑:当然std::vector调用赋值运算符,而不是复制构造函数(您也可以在错误消息中看到这一点)。已在说明中修复它,抱歉。这里是请求的示例源代码:#includeclassFoo{public:Foo(){}Foo(Foo&&ot

c++ - move 语义不完整吗?

在复制效率低下的情况下,move语义取代了复制语义。复制语义完全处理可复制对象,包括const对象。在c++11中已经存在无数不可复制的对象,例如std::unique_ptr。这些对象完全依赖于move语义,因为从一个对象move允许使它无效。这对于像RAII这样的流行设计模式很重要(恕我直言)。将const不可复制对象分配给内存区域时会出现问题。这样的对象无法以任何方式恢复。这在对象的生命周期中显然很重要,因为它是常量。然而,在它的生命周期结束时,当调用析构函数时,(不存在的)对象暂时是非常量的。我建议move析构函数可能是move语义模型的一个有值(value)的补充。考虑一个简

c++ - 使用 unique_ptr move 语义

我使用的是VisualStudio2012Update2,我无法理解为什么std::vector试图使用unique_ptr的复制构造函数。我看过类似的问题,大多数都与没有显式move构造函数和/或运算符有关。如果我将成员变量更改为字符串,我可以验证是否调用了move构造函数;但是,尝试使用unique_ptr会导致编译错误:errorC2248:'std::unique_ptr::unique_ptr':cannotaccessprivatememberdeclaredinclass'std::unique_ptr'.我希望有人能指出我所缺少的,谢谢!#include#include

c++ - 一个类型是否应该只 move ,仅仅因为复制可能很昂贵?

我有一个可复制的类型,但复制成本可能很高。我已经实现了move构造函数和move赋值。但是我遇到了性能问题,人们在按值传递时忘记调用move()。删除复制构造函数并为实际需要复制的罕见情况提供显式copy()方法是否是一种好的C++11风格?这在其他语言(Ruby、JavaScript)中是惯用的,但我不知道C++标准库中有任何内容纯粹为了性能而禁止复制。例如,std::vector是可复制的,而std::unique_ptr和std::thread由于其他原因是不可复制的。 最佳答案 Shouldatypebemove-only,

c++ - 重复 move 已被 move 捕获的 lambda 中的变量

我有以下测试代码:#include#includevoidprintValue(std::string&&val){std::cout我得到结果:Gotvalue:TestValueGotvalue:TestValueGotvalue:TestValue从lambda中move一个已被move捕获的对象将始终具有它被move到lambda中的初始状态是一个有效的假设,或者这只是一个处于“有效但未指定”状态的对象的产物状态”? 最佳答案 std::move不执行move操作;它只是将参数转换为右值。对于您的代码,printValue通

c++ - 标准 : container c++ move to front

我正在寻找一个像std::list这样可以有效地将元素移到前面的std容器:a-b-c-d-e将“b”移到前面:a-c-d-e-b标准容器中没有这样的功能。因此,我认为我必须结合remove和push_front函数,但有没有人能找到更好的主意?提前致谢。 最佳答案 如果你不必维护其他元素的顺序,那么最简单的解决方案无疑就是交换您想要的元素与容器中的第一个元素。这个将对所有容器有效。否则,std::list提供了一个splice操作,它可以使用。我认为类似于以下内容:voidmoveToFront(std::list&list,st

c++ - 使用 Howard Hinnant 的 short_alloc 进行快速 move 分配

我正在使用HowardHinnant的漂亮的基于竞技场的小分配器,short_alloc.令我震惊的是,从vector进行的move分配可以使用通常的快速move分配(即获取目标的资源)来完成,该vector已经超出其arena,因此分配在堆上。然而,事实并非如此:typedefarenaarena_type;typedefshort_allocalloc_type;typedefstd::vectorvec_type;arena_typearena1,arena2;vec_typevec1(alloc_type(arena1)),vec2(alloc_type(arena2));ve

c++ - 不同于复制构造函数的 move 构造函数的静态断言

想象一下,我有一个类A,move成本低,复制成本高。它可能看起来像classA{public:[...]private:HeavyClassm;};对于这个类,我想要一个静态验证类(1)是move可构造的并且(2)不简单的使用拷贝构造函数进行move构造,独立于move构造函数是否显式声明。这可能吗?至于为什么我会这样,请考虑以下示例:首先,该类自动生成move构造函数并按预期运行。然后,有人更改类并添加析构函数,这导致move构造函数不会隐式生成,而是使用复制构造函数。因此,static_assert将是理想的,但似乎is_move_constructible或is_triviall