7得票3回答
当我们使用右值引用时,发生了什么?std::move 是如何工作的?

我正在尝试理解右值引用和移动语义。在下面的代码中,当我将10传递给Print函数时,它调用了右值引用重载,这是预期的。但是,究竟会发生什么,那个10会被复制到哪里(或从哪里引用)?其次,std::move实际上是做什么的?它会从i中提取值10,然后传递它吗?还是它是指示编译器使用右值引用的指令...

33得票3回答
C++标准是否保证插入关联容器失败时不会修改rvalue引用参数?

#include <set> #include <string> #include <cassert> using namespace std::literals; int main() { auto coll = std::set{ "hell...

17得票2回答
修改rvalue引用的值 - 它是如何工作的?

以下代码可以编译并正常运行。就在我认为自己已经对右值引用和std::forward有了一个不错的掌握时,这个非常简单的代码揭示出我对右值的某些基本理解还存在疑惑。请澄清。#include <iostream> #include <iomanip> using names...

8得票4回答
将std::istream&&作为参数传递是否合理?

我遇到了一些这样的代码: SomeObject parse (std::istream && input) {.... input参数是一个右值引用,通常意味着函数旨在接收参数的所有权。但这里发生的情况有点不同。 parse函数将完全消耗输入流,并且要求使用右值引用,因...

7得票2回答
xvalues是否具有标识并可移动?

根据这份文件: http://www.stroustrup.com/terminology.pdf l-values具有身份并且不可移动。 pr-values是可移动的但没有身份。 x-values具有身份并且可移动。 我有几个关于这些的问题。 a. x-value具有身份的例子是...

16得票1回答
通过将rvalue数据成员扩展临时对象的生命周期对聚合类型有效,但对构造函数无效,为什么?

我发现以下方案可以延长临时对象的生命周期,虽然我不知道它是否应该这样做,但确实可以。struct S { std::vector<int>&& vec; }; int main() { S s1{std::vector<int>(5)}...

7得票1回答
为什么不能同时实现`getAB() &&`和`getAB()`两种方法?

为什么我们不能同时实现getAB() &&和getAB()两种方法,但是可以实现其中任何一种? 以下代码可行:http://ideone.com/4EgObJ struct Beta { Beta_ab ab; Beta_ab && getAB() ...

22得票5回答
标准库容器在GCC中在rvalue上产生大量副本

我正在编写一个跨平台的应用程序,在Linux和Windows上运行。 我注意到GCC构建过程中产生了很多无用的复制构造函数调用。 以下是一个示例代码,可以产生这种行为:struct A { A() { std::cout << "defaul...

565得票7回答
std::forward的主要目的是什么,它解决了哪些问题?

在完美转发中,使用 std::forward 将命名的右值引用 t1 和 t2 转换为未命名的右值引用。这样做的目的是什么?如果我们将 t1 和 t2 保留为左值,那么这会对被调用的函数 inner 产生什么影响呢?template <typename T1, typename T2&g...

7得票1回答
C++11是否保证在return语句中的局部变量将被移动而不是复制?

#include <vector> using namespace std; struct A { A(const vector<int>&) {} A(vector<int>&&) {} }; A f() { ...