41得票1回答
使用std::move和std::shared_ptr

我有一个如下定义的函数:void foo(std::shared_ptr<X> x) { ... }; 如果我声明一个指向X的shared ptr:std::shared_ptr<X> sourcePtr(new X(...)); 我可以按照以下方式调用foo:foo(...

41得票3回答
按值传递 vs const & 和 && 重载

所以在查找移动语义后,我发现普遍共识是在打算转移所有权时传递值。但是在Scott Meyer的通用引用演讲中,我注意到std::vector::push_back有2个重载: void push_back( const T& value ); void push_back( T&am...

40得票4回答
std::vector::emplace_back and std::move

使用std::vector::emplace_back和std::move是否有任何优势?或者只是多余的,因为std::vector::emplace_back会进行原地构造? 需要澄清的情况:std::vector<std::string> bar; 首先:bar.emplac...

38得票5回答
为什么在C++11中,如果需要复制,则推荐传递值而不是只需要一个const引用的原因是什么?

我正在尝试理解移动语义、右值引用、std::move等内容。通过在该网站上搜索各种问题,我一直试图弄清楚为什么传递 const std::string &name + _name(name) 不如 std::string name + _name(std::move(name)) 推荐...

38得票4回答
复制 vs std::move 用于整数类型

在这个例子中,默认复制和std::move有什么区别? move之后,新旧对象之间是否存在依赖关系? int main () { int a = 100; std::cout<<&a<<std::endl; auto a_copy ...

38得票2回答
默认虚析构函数是否会阻止编译器生成的移动操作?

受到帖子“为什么析构函数禁用隐式移动方法生成?”的启发,我想知道默认虚析构函数是否也是如此。class WidgetBase // Base class of all widgets { public: virtual ~WidgetBase() = default; ...

38得票4回答
现在我们有移动语义,是否专门使用std::swap已被弃用?

可能是重复问题: 移动语义==自定义交换函数已过时? 这是C++11中std::swap的样子: template<typename T> void swap(T& x, T& y) { T z = std::move(x); x = std::...

38得票3回答
C++11:如何编写具有atomic<bool>成员的移动构造函数?

我有一个带有原子成员变量的类:struct Foo { std::atomic&lt;bool&gt; bar; /* ... lots of other stuff, not relevant here ... */ Foo() : bar( false ) {} ...

38得票6回答
编译器生成的移动构造函数的行为是什么?

std::is_move_constructible&lt;T&gt;::value == true是否意味着T具有可使用的移动构造函数?如果是,它的默认行为是什么? 考虑以下情况: struct foo { int* ptr; }; int main() { { ...

38得票2回答
自动生成移动操作的规则是什么?

在C++98中,C++编译器可以通过成员逐一复制自动生成复制构造函数和复制赋值运算符,例如:struct X { std::string s; std::vector&lt;int&gt; v; int n; }; 编译器会自动生成 X 的拷贝构造函数和拷贝赋值运算符,...