move-semantics

    3热度

    2回答

    我有一个类,它包含一个用unique_ptr管理的c-style数组。我想提供一个构造函数: class A { unique_ptr<T[]> p; public: A(int d, X x) : p(new T[d]) { //Transfer from x to p without copying } } 这样我就可以建立我的对象的东西,如:

    1热度

    1回答

    当我运行下面的代码时,它会生成以下输出: 第一部分直接使用模板,第二部分使用从模板派生的类。初始化构造 模板假人:初始化构造 模板假人:空构造 模板假人:空构造 模板假人 的移动语义未在派生类(以粗体显示) 模板虚拟调用:+运营商 模板假人:移动分配 模板假人:初始化构造 模板假人:初始化构造 模板假人:空的构造 模板假人:空的构造 模板虚拟:+运营商 模板假人:拷贝构造函数 模板假人:拷贝赋值

    3热度

    2回答

    我想再次提出这个问题,尽管Why do Qt's container classes not allow movable, non-copyable element types?。我已经阅读了由QtCore维护者蒂亚戈(链接从链接Stackoverflow问题的答案)以下声明: 将不会实施,永远。由于隐式共享,可复制性是强制性要求。 我不明白这样一句话:复制能力是隐式共享的强制性要求,我理解的部分

    1热度

    2回答

    我已经做了简单的测试以了解更好的移动语义。输出结果对我而言是意外的。贝娄是我的测试功能: template<class T> void test(T&& v) { v++; } void main() { int v = 1; test(std::move(v)); std::cout << "Output:" << v << std::endl

    4热度

    2回答

    我一直有困难在C++中理解移动构造函数。我用默认构造函数,复制构造函数,移动构造函数和析构函数做了一个简单的类。另外,我定义了一个带有两个重载的函数,一个接受对该类的引用,另一个接受对该类的右值引用。我的测试代码如下。 #include <iostream> class c { public: c() { std::cout << "default constru

    1热度

    1回答

    项目17:了解特殊的成员函数生成。 移动的操作仅支持入级缺乏 明确宣布移动操作产生,复制操作, 或析构函数。 现在,当我指的是移动操作布展施工 或移动,分配数据成员或基类,有 不能保证此举将实际发生。 “成员移动”实际上更像是成员移动 移动请求,因为未启用移动的类型(...) 将通过其复制操作“移动”。 但是,我无法在我的环境中验证它们。 // compiled #include <iostre

    8热度

    3回答

    编译器告诉我我试图访问一个已删除的函数(即lambda表达式的拷贝构造函数)。但我不知道在哪里。 std::vector<std::function<void()>> tasks; std::packaged_task<int()> task{ [] { return 1; } }; tasks.emplace_back( [ t = std::move(task) ]() mutab

    3热度

    6回答

    我有一个简单的类结构建模离散模拟,其中包含一个状态矢量,每个状态矢量都包含多个Transitions,并保存为智能指针的矢量。我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态。 #include <vector> #include <memory> class Transition { public: Transition() {} }; class

    1热度

    1回答

    说我有一个A类型的对象。 如果我想将它移动到函数foo(A)。 一个选项是做foo(std::move(a)),它将调用移动构造函数。 但是,假设我正在使用一个我无法控制的类。如果我仍然想要移动这个类型,这不就足够了吗? std::unique_ptr<A> a_ptr(new A()); foo(std::move(a_ptr)); 与foo更改为接受unique_ptr。 两者是否相似(

    3热度

    1回答

    我想收集lambda表达式,并要求不能复制lambas,只能移动。 这是因为lambas可能需要移动捕捉一些不可复制构造的参数。 例子: NonCopyableType varName ; auto func = [a=move(varName)](){ ... } ; //varName is move-captured 这个我想存储func在vector后,但因为它需要lambda表达式