当最后一次使用可移动对象时,编译器是否会自动使用移动语义?
我最近一直在研究右值引用,并得出结论,在将创建对象的完整副本的任何地方使用按值传递是非常有利的(有关完整的理由,请参见例如 添加右值引用运算…
按值返回时值参数是否隐式移动?
考虑以下函数: Foo foo(Foo x) { return x } return x 会调用复制构造函数还是移动构造函数吗? (让我们把 NRVO 放在一边。) 为了进行调查,我编写…
将 unique_ptr 从一个向量移动到另一个向量
我想将存储在未排序向量中的 unique_ptr 移动到另一个向量,该向量将包含已排序的指针向量。 移动 unique_ptr 肯定不会自动删除第一个向量中的元素吗…
是否存在返回 RValue 引用 (&&) 有用的情况?
函数应该返回 RValue 引用是否有原因?一种技巧、技巧、习语或模式? MyClass&& func( ... ) 我知道一般情况下返回参考文献的危险,但有时我们…
类中方法的正确使用`=delete`
以下代码片段对于取消定义类的所有其他生成的方法和构造函数是否正确? struct Picture { // 'explicit': no accidental cast from string to Picture…
移动语义 std::move 如何使用它
#include <type_traits> template<class T> typename std::remove_reference<T>::type&& move(T&& v) { return v } void mai…
为什么 std::move 使用 std::remove_reference 实现?
我不太明白 std::move 函数 template <class T> typename remove_reference<T>::type&& move(T&& a) { return a } 为什么要 remo…
C++11 - 区分右值指针
如何将变量区分为编译器构造的字符串? 例如,右值 "Hello, World" 的类型为 const char*。 const char* 本身并不意味着指针不能更改。 char* const …
如何达到“最佳”效果?带有右值的算术表达式中的运算符重载解析?
首先,我为这个过于冗长的问题表示歉意。我想不出任何其他方法来准确总结我的问题...现在讨论实际问题: 我目前正在试验 C++0x 右值引用...以下代码会…
为什么 std::forward 放弃 constexpr-ness?
由于未声明 constexpr,std::forward 将放弃将参数转发到的任何函数的 constexpr 性。 为什么 std::forward 没有声明 constexpr 本身,以便它可以保留…
C++11 右值和带有 return 语句的移动语义
我试图理解 C++11 的右值引用和移动语义。 这些示例之间有什么区别,哪些示例不进行矢量复制? 第一个例子: std::vector<int> return_vector(voi…
使交换更快、更易于使用且异常安全
我昨晚无法入睡,开始思考 std::swap。这是熟悉的 C++98 版本: template <typename T> void swap(T& a, T& b) { T c(a) a = b b = c } 如…
实现 fstream 移动的 C++0x 库
找到如何返回 fstream (C++0x) 的答案后,我现在想知道是否有一个当前的 c++0x 库可以实现 fstream 的移动(甚至交换)(如 gcc (27.9) 没有)。我更…
是否有必要从不同的类定义移动构造函数?
请考虑以下问题: struct X { Y y_ X(const Y & y) :y_(y) {} X(Y && y) :y_(std::move(y)) {} } 是否有必要定义像第二个这样的构造函数才能…