首页 文章
  • 3 votes
     answers
     views

    为什么我不能使用迭代器将unique_ptr从集合移动到函数参数?

    我有 set 的 unique_ptr 实例,并希望将所有这些实例作为参数传递给函数 . 以下代码演示的示例 . #include <memory> #include <set> #include <vector> using std::set; using std::unique_ptr; using std::vector; void doStuff(u...
  • 1456 votes
     answers
     views

    什么是移动语义?

    我刚刚听完关于C++0x的软件工程电台podcast interview with Scott Meyers . 大多数新功能对我来说都很有意义,我现在对C 0x感到兴奋,除了一个 . 我仍然没有得到移动语义......它们究竟是什么?
  • 468 votes
     answers
     views

    什么是std :: move(),什么时候应该使用?

    这是什么? 它做了什么? 什么时候应该使用? 赞赏良好的链接 .
  • 1 votes
     answers
     views

    传递右值引用与非const左值引用

    如果在将变量传递给函数后我没有使用变量,是否将其传递给非常量左值引用或使用std :: move将其传递给右值引用是否重要 . 假设存在两种不同的重载 . 这两种情况的唯一区别是传递的对象的生命周期,如果我通过右值引用则会更早结束 . 还有其他因素需要考虑吗? 如果我有一个函数foo重载像: void foo(X& x); void foo(X&& x); X x; fo...
  • 27 votes
     answers
     views

    默认的虚拟析构函数是否会阻止编译器生成的移动操作?

    受到帖子Why does destructor disable generation of implicit move methods?的启发,我想知道默认的虚拟析构函数是否也是如此,例如: class WidgetBase // Base class of all widgets { public: virtual ~WidgetBase() = default; ...
  • 3 votes
     answers
     views

    VS2010绑定实现不支持只移动类型?

    我发现以下代码不能在Visual Studio 2010中编译(但在GCC中可以正常工作): using namespace std; unique_ptr<string> up(new string("abc")); auto bound = bind(&string::size, move(up)); bound(); 我得到的错误是: 'std :...
  • 362 votes
     answers
     views

    如何从函数中返回一个对象,考虑C 11 rvalues并移动语义?

    我正在尝试理解rvalue引用并移动C 11的语义 . 这些示例之间有什么区别,哪些不会执行矢量复制? 第一个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&r...
  • 80 votes
     answers
     views

    我可以列出 - 初始化只移动类型的向量吗?

    如果我通过我的GCC 4.7快照传递以下代码,它会尝试将 unique_ptr 复制到向量中 . #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { mo...
  • 3 votes
     answers
     views

    移动unique_ptr <T>的向量[重复]

    这个问题在这里已有答案: Should a move constructor take a const or non-const rvalue reference? 4个答案 所以我有一种情况需要存储一个抽象类型的向量,据我所知这需要使用unique_ptrs或类似的向量 . 因此,为了移动包含unique_ptrs向量的类的实例,我需要定义一个我已经完成的移动构造函数 . 但是,如下面的示例...
  • 3 votes
     answers
     views

    我应该何时使用参考而不是转让所有权?

    从the Rust book's chapter on ownership,可以通过转移所有权或使用可变或不可变引用将不可复制的值传递给函数 . 当您转移值的所有权时,它不能再用于原始函数:如果您愿意,必须将其返回 . 传递引用时,您可以借用该值并仍然可以使用它 . 我来自默认值不可变的语言(Haskell,Idris等) . 因此,我可能永远不会考虑使用引用 . 在两个地方拥有相同的 Value...
  • 2 votes
     answers
     views

    在Rust中移动语义

    我在Rust中包装一个C库,它的许多函数通过指向结构的指针来获取参数,这些结构本身通常具有指向其他结构的指针 . 为了减少开销,我想提供将Rust数据编组的结果缓存到C结构中的能力 . 以下是C库如何期望某些参数的示例: #[repr(C)] struct Foo { x: i32, y: f32 } #[repr(C)] struct Bar { p_foo: *con...
  • 12 votes
     answers
     views

    Rust如何移动不可复制的堆栈变量?

    这里记录了Rust的移动语义的一个很好的例子:在Rust By Example网站上的Rust Move Semantics . 我对两个案例都有基本的了解 . 第一个原语是如何使用原语可以使用新的别名,原始文件仍可以使用,因为最终结果是 i32 使用 Copy 特征时看到的副本 . 这对我来说很有意义 . 此外,由于许多充分的理由,第二个示例在具有多个引用堆上的 i32 的别名方面是有意义的 ....
  • 11 votes
     answers
     views

    为什么Rust不允许复制和删除一种类型的特征?

    来自the book: 如果类型或其任何部分已实现Drop特征,Rust将不允许我们使用Copy trait注释类型 . 如果类型需要在值超出范围时发生特殊情况并且我们将复制注释添加到该类型,那么我们将得到编译时错误 . 为什么设计决定不允许 Copy 和 Drop 在同一类型上?
  • 218 votes
     answers
     views

    什么是“这个的右值参考”?

    在clang的C++11 status page中遇到了一个名为&quot;rvalue reference for *this&quot;的提案 . 我已经阅读了很多关于rvalue引用并理解它们的内容,但我认为我不知道这一点 . 我也无法使用这些条款在网上找到太多资源 . 页面上的提案文件有一个链接:N2439(将移动语义扩展到* this),但我也没有从中获得太多的例子 . 这个功能是什么?...
  • 20 votes
     answers
     views

    为什么C 11具有值参数的隐式移动,而不是rvalue参数?

    在C 11中,值参数(和其他值)在返回时享受隐式移动: A func(A a) { return a; // uses A::A(A&amp;&amp;) if it exists } 至少在MSVC 2010中,右值参考参数需要 std::move : A func(A &amp;&amp; a) { return a; // uses A::A(A const&amp;) e...
  • 18 votes
     answers
     views

    如何在函数返回期间使用std :: string移动语义? [重复]

    可能重复:C 11 rvalues并移动语义混淆 我认为是正确的 std::string GetLine() { std::string str; std::getline(std::cin, str); return std::move(str); } 但是在这个链接http://www.cprogramming.com/c++11/rvalue-references-and-move-s...
  • 12 votes
     answers
     views

    在重载算法中移动语义和Rvalue-Reference

    我正在用C编写一个小型数值分析库 . 我一直在尝试使用最新的C 11功能,包括移动语义 . 我理解以下帖子中的讨论和最佳答案:C++11 rvalues and move semantics confusion (return statement),但有一种情况我仍然试图解决这个问题 . 我有一个类,称之为 T ,它配备了重载运算符 . 我也有复制和移动构造函数 . T (const T &amp...
  • 27 votes
     answers
     views

    C 11在返回锁定时移动

    在“C Concurrency in Action”一书中阅读以下方法 std::unique_lock&lt;std::mutex&gt; wait_for_data() { std::unique_lock&lt;std::mutex&gt; head_lock(head_mutex); data_cond.wait(head_lock,[&amp;]{return head....
  • 199 votes
     answers
     views

    现代C可以免费获得性能吗?

    有时声称即使只编译C 98代码,C 11/14也可以提升性能 . 理由通常是移动语义,因为在某些情况下,rvalue构造函数是自动生成的,或者现在是STL的一部分 . 现在我想知道这些案例以前是否已经由RVO或类似的编译器优化处理过了 . 我的问题是,如果你能给我一个C 98代码的实际例子,使用支持新语言功能的编译器,无需修改,运行得更快 . 我确实理解标准符合编译器不需要执行复制省略,因此移动语...
  • 3 votes
     answers
     views

    C移动语义 - 何时返回右值引用

    我已经阅读了几篇文章,说在返回局部变量时允许移动语义的函数签名应该看起来与它按值返回完全一样,只要定义了移动构造函数/移动赋值运算符,就会发生RVO或移动语义视情况而定 . 虽然我读过许多人说你的返回类型几乎从不是一个右值引用,因为它在本地移动变量的情况下返回一个悬空引用或者可以阻止RVO,我想知道当移动对象时它是否正确具有超出函数返回范围的生命周期,例如移动将继续存在的对象的全局对象或成员对象 ...
  • 41 votes
     answers
     views

    如何实际实施五条规则?

    UPDATE 在底部 q1: 如何为管理相当繁重的资源的类实现rule of five,但是您希望它按值传递,因为这极大地简化并美化了它的用法?或者甚至不需要所有五项规则? 在实践中,我开始使用3D成像,其中图像通常是128 * 128 * 128双倍 . 能够写这样的东西会让数学变得更容易: Data a = MakeData(); Data c = 5 * a + ( 1 + MakeMore...
  • 47 votes
     answers
     views

    std :: function的仅移动版本

    因为 std::function 是可复制的,所以标准要求用于构造它的callables也是可复制的: n337(20.8.11.2.1) template &lt;class F&gt; function(F f);要求:F应为CopyConstructible . 对于参数类型ArgTypes和返回类型R,f应为Callable(20.8.11.2).A的复制构造函数和析构函数不应抛出异常 ...

热门问题