草庐IT

c++ - 是否可以 std::move 本地堆栈变量?

请考虑以下代码:structMyStruct{intiInteger;stringstrString;};voidMyFunc(vector&vecStructs){MyStructNewStruct={8,"Hello"};vecStructs.push_back(std::move(NewStruct));}intmain(){vectorvecStructs;MyFunc(vecStructs);}为什么会这样?在调用MyFunc的那一刻,返回地址应该放在当前线程的栈上。现在创建NewStruct对象被创建,它也应该放在堆栈上。通过std::move,我告诉编译器,我不打算再使用

c++ - std::array 应该有 move 构造函数吗?

在std::array上不能有效地实现move(O(1)),那么为什么它有move构造函数呢? 最佳答案 std::array有一个编译器生成的move构造函数,它允许将一个实例的所有元素move到另一个实例中。如果元素可有效move或仅可move,这将很方便:#include#includestructFoo{Foo()=default;Foo(Foo&&){std::couta;std::arrayb=std::move(a);}所以我想说std::array应该有一个move复制构造函数,特别是因为它是免费的。没有一个需要它被

c++ - std::array 应该有 move 构造函数吗?

在std::array上不能有效地实现move(O(1)),那么为什么它有move构造函数呢? 最佳答案 std::array有一个编译器生成的move构造函数,它允许将一个实例的所有元素move到另一个实例中。如果元素可有效move或仅可move,这将很方便:#include#includestructFoo{Foo()=default;Foo(Foo&&){std::couta;std::arrayb=std::move(a);}所以我想说std::array应该有一个move复制构造函数,特别是因为它是免费的。没有一个需要它被

未调用 C++11 move 构造函数,首选默认构造函数

假设我们有这个类:classX{public:explicitX(char*c){cout这个示例用法:Xx("test");cout输出是:ctortestcopytestctor我正在使用默认设置的VS2010。我希望最后一个对象(z)是move构造的,但事实并非如此!如果我使用Xz(move(X("test")));那么输出的最后几行是ctormovetest,正如我所料。是(N)RVO的情况吗?问:是否应该按照标准调用move-ctor?如果是,为什么不叫它? 最佳答案 你看到的是copyelision,它允许编译器直接将临

未调用 C++11 move 构造函数,首选默认构造函数

假设我们有这个类:classX{public:explicitX(char*c){cout这个示例用法:Xx("test");cout输出是:ctortestcopytestctor我正在使用默认设置的VS2010。我希望最后一个对象(z)是move构造的,但事实并非如此!如果我使用Xz(move(X("test")));那么输出的最后几行是ctormovetest,正如我所料。是(N)RVO的情况吗?问:是否应该按照标准调用move-ctor?如果是,为什么不叫它? 最佳答案 你看到的是copyelision,它允许编译器直接将临

c++ - 为什么不使用 `make_x()` 函数尽可能省略 move 构造函数?

我不知道为什么在最后一种情况下是在启用复制省略时调用move构造函数(甚至是强制性的,例如在C++17中):classX{public:X(inti){std::clogXmake_X(T&&arg){returnX(std::forward(arg));}intmain(){autox1=make_X(1);//1xconvertingctorinvokedautox2=X(X(1));//1xconvertingctorinvokedautox3=make_X(X(1));//1xconvertingand1xmovectorinvoked}在这种情况下,哪些规则会阻碍move构造

c++ - 为什么不使用 `make_x()` 函数尽可能省略 move 构造函数?

我不知道为什么在最后一种情况下是在启用复制省略时调用move构造函数(甚至是强制性的,例如在C++17中):classX{public:X(inti){std::clogXmake_X(T&&arg){returnX(std::forward(arg));}intmain(){autox1=make_X(1);//1xconvertingctorinvokedautox2=X(X(1));//1xconvertingctorinvokedautox3=make_X(X(1));//1xconvertingand1xmovectorinvoked}在这种情况下,哪些规则会阻碍move构造

c++ - 使用 C++11 复制和 move 时避免代码重复

C++11“move”是一个不错的功能,但我发现当与“复制”同时使用时很难避免代码重复(我们都讨厌这个)。下面的代码是我实现的一个简单的循环队列(不完整),两个push()方法除了一行外几乎一样。我遇到过很多类似的情况。任何想法如何在不使用宏的情况下避免这种代码重复?===编辑===在这个特定示例中,可以将重复的代码重构出来并放入单独的函数中,但有时这种重构不可用或不容易实现。#include#includetemplateclassCircularQueue{public:CircularQueue(longsize=32):size{size}{buffer=std::malloc

c++ - 使用 C++11 复制和 move 时避免代码重复

C++11“move”是一个不错的功能,但我发现当与“复制”同时使用时很难避免代码重复(我们都讨厌这个)。下面的代码是我实现的一个简单的循环队列(不完整),两个push()方法除了一行外几乎一样。我遇到过很多类似的情况。任何想法如何在不使用宏的情况下避免这种代码重复?===编辑===在这个特定示例中,可以将重复的代码重构出来并放入单独的函数中,但有时这种重构不可用或不容易实现。#include#includetemplateclassCircularQueue{public:CircularQueue(longsize=32):size{size}{buffer=std::malloc

c++ - 我是否保证在 move vector 后指向 std::vector 元素的指针有效?

考虑这个例子:std::vectorv1={1,2,3};constint*i=&v1[1];std::vectorv2(std::move(v1));std::cout尽管在许多STL实现中这可能会起作用,但我是否保证在movestd::vector并且支持v2的内部缓冲区时不会执行重新分配和以前的v1一样吗?我无法在Internet和标准本身上找到此信息。 最佳答案 这是LWGopenissue2321[强调我的]Movingcontainersshould(usually)berequiredtopreserveiterato