7得票2回答
为什么std::vector使用移动构造函数,尽管声明为noexcept(false)?

无论我在互联网上阅读哪篇文章,都强烈建议如果我希望我的类与std::vector很好地配合(即,std::vector使用了我的类的移动语义),就应该将移动构造函数声明为“noexcept”(或者noexcept(true))。即使作为一项实验,我将其标记为noexcept(false),为什...

10得票5回答
移动对象仍会被销毁吗?

在学习C++11时,我对移动对象的行为方式感到惊讶。考虑以下代码: #include <exception> #include <iostream> #include <type_traits> class Moveable { public: Mo...

8得票5回答
移动的对象可以用于什么?

移动对象后,必须能够销毁它: T obj; func(std::move(obj)); // don't use obj and let it be destroyed as normal 但是 obj 还能做什么呢?你能把另一个对象移动到它里面吗? T obj; func(std::...

8得票1回答
为什么我不能将一个常量左值引用绑定到返回 T&& 的函数?

我曾将一个函数的返回值绑定到一个常量左值引用上,但是该对象在常量左值引用的生命周期结束之前被删除了。 在以下示例中,Foo 对象在 foo 生命周期结束之前被销毁: #include <iostream> #include <string> struct Foo ...

14得票5回答
使交换更快、更易于使用和异常安全

昨晚我无法入睡,开始思考 std::swap。这是熟悉的 C++98 版本: template <typename T> void swap(T& a, T& b) { T c(a); a = b; b = c; } 如果用户自定义的类...

18得票2回答
按值返回std::vector

常言道,在 C++11 中,通过值返回 std::vector 是合理的。 在 C++03 中,由于 RVO 可以优化掉拷贝操作,这通常是正确的,但是这个“应该”让大多数开发人员感到不安。 在 C++11 中,返回的局部变量 std::vector 是否总是会被移动? 如果该向量是局部变...

14得票1回答
赋值运算符中使用值而不是引用的影响分析

这个问题源于这个答案中提出的问题。 通常情况下,我们为类型T定义复制赋值运算符为T& operator=(const T&),移动赋值运算符为T& operator=(T&&)。 但是,当我们使用值参数而不是引用时会发生什么? class T { ...

70得票3回答
std::function的移动语义版本

因为 std::function 可以复制,所以标准要求用于构造它的可调用对象也必须可以被复制: n337 (20.8.11.2.1) template<class F> function(F f); 要求: F 必须是可复制的。对于参数类型 ArgTypes 和返回类型 R 的...

25得票1回答
使用std::forward的构造函数

据我所知,在C++11中有效实现构造函数的两种常见方法是使用它们中的两个。Foo(const Bar& bar) : bar_{bar} {}; Foo(Bar&& bar) : bar_{std::move(bar)} {}; 或者只是一种时尚风格Foo(B...

13得票2回答
为什么std::move使用std::remove_reference来实现?

我对std::move函数的理解不是很好。 template <class T> typename remove_reference<T>::type&& move(T&& a) { return a; } 为什么要移除引用...