move-semantics

    1热度

    2回答

    我有一个问题,我想在单个容器类中存储结构向量。 问题是,当为这些向量创建这个容器时,我浪费资源,因为向量被复制;没有移动。为什么临时返回的资源create()没有转移到主函数中的局部变量master_data? 我假定将工作 示例代码被呈现以下(并且在coliru HERE): #include <stdio.h> #include <vector> #include <stdlib.h>

    8热度

    1回答

    我有一个复制/移动探测类: #include <iostream> struct A { A() { std::cout << "Creating A" << std::endl; } ~A() noexcept { std::cout << "Deleting A" << std::endl; }

    0热度

    1回答

    今天我发现这个代码不工作,因为我期望它的工作。 根据我对L值的知识,应该调用复制构造函数,而对于R值,应该选择移动构造函数。否则,std::move的目的实际上什么都不做,只能投射到R值。我期待return obj将调用复制构造函数,但它调用移动。 我知道这里的副本是无用的,但这是关于规则的。如果我的拷贝构造函数有副作用,那就是我的情况(我知道它不应该,但从技术上说它可以 - 例如:std ::

    6热度

    1回答

    Rust中的函数std::mem::drop移动它的参数,然后通过超出范围来破坏它。我在C++写的类似功能的尝试看起来是这样的: template <typename T, typename = std::enable_if_t<std::is_rvalue_reference<T &&>::value>> void drop(T &&x) { T(std::move(x

    1热度

    1回答

    考虑一个无锁并发数据结构,其中pop()操作需要返回一个项目或false如果该cointainer是空的(而不是阻塞或投掷)。数据结构以用户类型T为模板,该用户类型可能很大(但也可以是轻量级的,并且我希望在任何情况下都能提高效率)。 T必须至少可移动,但我不希望它必须是可复制的。 我在想这个函数的签名应该是bool DS<T>::pop(T &item),所以这个项目被解压为一个out-param

    0热度

    2回答

    后,我不明白为什么这个代码工作: class Base { public: virtual void doStuff() const{} Base(Base & b) = delete; Base() { cout << "Base" << endl; } ~Base() { cout << "~Base" << endl

    0热度

    1回答

    考虑一个无锁的工作窃取(DE)阙以下功能: template<class T> inline T WorkStealQ<T>::Steal(void) { auto tail{_tail.load(std::memory_order_acquire)}; if (_head.load(std::memory_order_acquire) <= tail) return T(

    4热度

    2回答

    例如: Big create() { Big x; return std::move(x); // return static_cast<typename std::remove_reference<T>::type&&>(t) // why not elide here? } 假设应用std::move()返回一个局部变量抑制移动的语义,因为编译器不能做出的一般功能

    1热度

    1回答

    考虑一个自定义类X保持某些资源(这里由一个整数成员变量表示简单)与移动的构造(MC),移动赋值运算符(MAO),和一个自定义交换函数: class X { int i_; public: X(int i) : i_(i) { } X(X&& rhs) = default; // move constructor X& operator=(X&& rhs)

    4热度

    1回答

    我对下面的代码有疑问。我的编译器是MSVC++ 17的Visual Studio版本15.3与编译器选项/ STD:C++ 14(与/ STD:C++最新)在释放模式运行: struct Bar { int a; std::string b; Bar() { std::cout << "default\n"; } Bar(int a, const std: