62得票3回答
在从函数返回值时使用std::move(),以避免复制。

考虑一个支持默认移动语义的类型T。还考虑下面的函数: T f() { T t; return t; } T o = f(); 在旧的C++03中,一些非最优化的编译器可能会调用两次拷贝构造函数,一次是为了"返回对象",一次是为了o。 在C++11中,由于f()内的t是一个...

8得票1回答
为什么我可以为右值引用赋值?

我最近开始学习rvalue、lvalue和移动语义,但有些概念不太理解,比如rvalue引用。为什么我可以将值分配给rvalue引用,例如:int&& x = 10;?这不意味着rvalue引用是一个lvalue吗?(我原来认为rvalue引用是一个rvalue)如果是这样,那...

8得票2回答
我应该在构造函数中总是使用std::move吗?

在示例A中使用的移动语义是否必要,哪个结构体更优? 示例A: struct A { std::string a; A( std::string a ) : a( std::move(a) ){ } }; 例子 B: struct B { std::string...

10得票1回答
为什么非可变 lambda 捕获可以被移动?

据我所知,不可变的lambda作为const变量捕获变量。这让我想知道为什么它们仍然可以被移动?auto p = std::make_unique<int>(0); auto f = [p = std::move(p)](){ p->reset(); }; // Error,...

11得票3回答
移动操作抛出了什么异常?

据我理解,在重新分配 vector 内存时,移动构造函数和移动赋值函数必须标记为 noexcept 才能被编译器利用。 然而,是否存在真实世界的情况,即移动构造或移动赋值可能会抛出异常? 更新:当类在构造时拥有已分配的资源时,不能使用不抛异常的移动。

7得票2回答
为什么我们不能有可移动的迭代器?

C++11引入了一个“移动”算法,它的行为类似于“复制”算法,但是它会移动数据而不是复制数据。我想知道为什么委员会没有更新复制算法以使用前向语义(或者可能是除此之外)。 vector提供T的迭代器, const vector提供const T的迭代器。 是否有理由让vector &&提供T ...

11得票5回答
如果使用可移动类型,从std::vector中删除一个元素是否仍然会很耗费资源?

通常认为在中间删除一个元素会导致std::vector的开销增大,因为它需要将它后面的每个元素复制下来以填补空洞。 从C++11开始,std::vector将会移动所有的元素,这应该是非常快的(至少相对于复制而言)。虽然仍然是线性时间复杂度,但总体上应该比旧版本更快。 这是真的吗?我不用再...

16得票1回答
如何返回一个没有复制构造函数的对象

我的问题涉及如何返回一个没有复制构造函数的对象。例如,假设我有一些位于堆中的bigResource,并且我使用unique_ptr来跟踪它。现在假设我把这个资源的所有权交给了一个毛毛虫。那么我就有了一个名为CaterpillarWithBigResource的对象。现在,在某个时刻,这个Cat...

19得票2回答
为什么抛出局部变量会调用移动构造函数?

最近,我尝试“玩弄”rvalue以了解它们的行为。大多数结果并不让我惊讶,但后来我发现,如果我扔掉一个局部变量,移动构造函数将被调用。 直到那时,我认为移动语义规则的目的是确保对象仅在编译器能够检测到它将不再使用(如临时对象)或用户承诺不再使用它(如std::move)时才会移动(并变为无效)...

7得票2回答
移动构造函数不会被继承也不会默认生成

我尝试通过扩展std::ifstream的一个函数来更轻松地读取二进制变量,结果让我惊讶的是,使用using std::ifstream::ifstream;并未继承移动构造函数。更糟糕的是,它被明确地删除了。 #include <fstream> class BinFile:...