176得票10回答
如何在std::unique_ptr成员中使用自定义删除器?

我有一个类,其中包含一个unique_ptr成员。class Foo { private: std::unique_ptr<Bar> bar; ... }; Bar是一个第三方类,具有创建(create())和销毁(destroy())函数。 如果我想在一个独立的...

169得票3回答
在range-based for循环中使用转发引用的优点是什么?

如果我只想执行只读操作,那么const auto&就足够了。然而,我遇到了for (auto&& e : v) // v is non-const 最近我已经发现有几次在一些不常见的情况下使用转发引用(forwarding references)可能比使用auto&a...

169得票6回答
何时应该在函数返回值上使用std::move?

在这种情况下struct Foo {}; Foo meh() { return std::move(Foo()); } 我相信此操作是不必要的,因为新创建的 Foo 将是一个 xvalue。但是在这种情况下呢?struct Foo {}; Foo meh() { Foo foo; ...

165得票2回答
一个已被移动的对象还能做什么?

标准是否明确定义了对象从移动后可以做什么?我曾经认为,你只能销毁一个已经移动的对象,但这是不够的。 例如,考虑标准库中定义的函数模板swap: template <typename T> void swap(T& a, T& b) { T c = std...

163得票4回答
一个 `=default` 移动构造函数是否等同于成员逐一移动构造函数?

这是什么? struct Example { string a, b; Example(Example&& mE) : a{move(mE.a)}, b{move(mE.b)} { } Example& operator=(Example...

146得票6回答
移动赋值运算符和 `if (this != &rhs)`

在一个类的赋值运算符中,通常需要检查被赋值的对象是否为调用对象,以免出现问题:Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment...

140得票2回答
为什么std::move被命名为std::move?

std::move(x)函数实际上并没有真正移动任何东西。 它只是将一个左值转换为右值。 为什么要这样做呢? 这难道不会引起误导吗?

133得票4回答
在C++11中,何时将类型设置为不可移动?

我很惊讶这个问题没有出现在我的搜索结果中,考虑到在C++11中移动语义的实用性,我认为某个人以前应该已经问过了: 在何时需要(或者说是一个好主意)将类设为不可移动的? (除了与现有代码兼容性等原因之外。)

125得票2回答
std::move如何将表达式转换为右值?

我发现自己并没有完全理解std::move()的逻辑。 一开始,我尝试通过Google搜索相关内容,但貌似只有关于如何使用std::move()的文档,没有关于其结构如何工作的信息。 我的意思是,我知道这是一个模板成员函数,但当我查看VS2010中std::move()的定义时,仍然感到困...

124得票8回答
initializer_list和移动语义

我可以将元素从std :: initializer_list<T>中移出吗?#include <initializer_list> #include <utility> template<typename T> void foo(std::in...