草庐IT

btn-move-forward

全部标签

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::forward?

ScottMeyers在他的新书“EffectiveModernC++”中展示了以下函数作为使用decltype(auto)的示例(第28页):templatedecltype(auto)authAndAccess(Container&&c,Indexi){authenticateUser();returnstd::forward(c)[i];}我的问题很简单。为什么我们需要将std::forward应用到c这里?我们没有在任何地方传递c,而是在其上调用operator[]。并且没有一个标准容器具有operator[]的ref-qualified重载(r-value/l-value重载

c++ - 为什么在访问元素之前在容器上使用 std::forward?

ScottMeyers在他的新书“EffectiveModernC++”中展示了以下函数作为使用decltype(auto)的示例(第28页):templatedecltype(auto)authAndAccess(Container&&c,Indexi){authenticateUser();returnstd::forward(c)[i];}我的问题很简单。为什么我们需要将std::forward应用到c这里?我们没有在任何地方传递c,而是在其上调用operator[]。并且没有一个标准容器具有operator[]的ref-qualified重载(r-value/l-value重载

未调用 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++ - 为什么在概念中使用std::forward?

我正在阅读cppreferencepageonConstraints并注意到以下示例://exampleconstraintfromthestandardlibrary(rangesTS)templateconceptboolSwappable=requires(Tt,Uu){swap(std::forward(t),std::forward(u));swap(std::forward(u),std::forward(t));};我不知道他们为什么要使用std::forward。是否尝试在模板参数中支持引用类型?我们是否不想用左值调用swap,并且当forward和T是标量(非引用)类

c++ - 为什么在概念中使用std::forward?

我正在阅读cppreferencepageonConstraints并注意到以下示例://exampleconstraintfromthestandardlibrary(rangesTS)templateconceptboolSwappable=requires(Tt,Uu){swap(std::forward(t),std::forward(u));swap(std::forward(u),std::forward(t));};我不知道他们为什么要使用std::forward。是否尝试在模板参数中支持引用类型?我们是否不想用左值调用swap,并且当forward和T是标量(非引用)类

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

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