草庐IT

move_function_imp

全部标签

c++ - 如何在不传递大量参数的情况下处理类的 "many small functions"的想法?

随着时间的推移,我开始欣赏许多小函数的思维方式,我真的很喜欢它,但我很难摆脱羞怯将它应用到类中,尤其是那些有很多小函数的类非公共(public)成员变量。每个额外的辅助函数都会使界面变得困惑,因为代码通常是特定于类的,我不能只使用一些通用代码。(据我所知,无论如何,还是一个初学者,不知道那里的每个图书馆等)所以在极端情况下,我通常会创建一个辅助类,它成为需要操作的类的友元,因此它可以访问所有非公共(public)内容。另一种方法是需要参数的自由函数,但即使过早优化是邪恶的,而且我还没有真正分析或反汇编它......我仍然害怕有时仅仅想到传递我需要的所有东西,即使只是作为引用,即使每个参

c++ - STL 容器 move 语义并按值返回 : how many times of copying get avoided away?

我知道在C++11中,move语义已经在STL容器中实现以避免临时对象。人们说现在编写按值返回的函数是完美的。但我对究竟有多少次复制实际上被避免感到困惑。请看下面的例子:vectormyVector(){vectorres;res.push_back(4);res.push_back(5);returnres;}vectorv=myVector();我的理解是在c++03中,myVector返回res的拷贝(4,5复制了一次),在评估vectorv=myVector();时vector的复制构造函数vector(constvector&)被调用(4,5复制了两次)。但是在具有move语

c++ - 左值何时在 C++ 中 move 而不是复制?

鉴于以下情况:FoogetFoo(){Fooresult=doSomeWork();returnresult;}C++是否保证result会被move,而不是被复制?或者换句话说,编写returnstd::move(result)是多余的吗?在没有显式std::move强制转换的情况下,是否有任何(其他)标准规定将静默move而不是复制左值的情况?注意事项:假设Foo是可move构造的。忽略复制/move省略,这可能另外适用。 最佳答案 尽管move可能会被省略,但是是的。如果move构造函数可用,则永远不会发生复制。为了清楚起见,

c++ - 在编译时捕获 std::function 分配

我只想允许在我的代码库中使用std::function,前提是它不进行任何分配。为此,我可以编写类似下面的函数,并且只用它来创建我的函数实例:templatestd::functionmakeFunction(Functorf){returnstd::function(std::allocator_arg,DummyAllocator(),f);}如果DummyAllocator在运行时被使用,它将在何处断言或抛出。理想情况下,我想在编译时捕获分配用例。即templatestd::functionmakeFunction(Functorf){static_assert(sizeneed

c++ - 如何强制 std::sort 使用 move 构造函数和 move 赋值?

我有一个类Data这是(就目前而言)不可复制的。std::sort在std::vector之所以有效,是因为我已经为Data定义了move构造函数和move赋值。.我这样做是因为类里面有很多数据,复制内容太慢了。但是,我现在正在考虑添加一个复制构造函数Data(constData&other)和标准赋值运算符(来自constData&)到类,出于不相关的原因。我如何确保当我对Data的vector进行排序时,std::sort还会使用move构造函数和move赋值吗? 最佳答案 HowcanImakesurethatwhenIsor

c++ - 组合 std::forward、std::move 和 volatile 时的意外返回类型

代码ongcc.godbolt.org.我创建了一个简单的类型特征来删除右值引用:templatestructremove_rvalue_reference{usingtype=T;};templatestructremove_rvalue_reference{usingtype=T;};templateusingremove_rvalue_reference_t=typenameremove_rvalue_reference::type;我用它来实现一个copy_if_rvalue(x)函数,其返回类型取决于传递的参数:templateconstexprautocopy_if_rva

c++ - 在 C++17 中使用容器时,noexcept move 操作是否有好处?

当阅读C++11时,我有一种感觉,当使用标准容器(如std::vector)和用户定义的数据类型时,鼓励提供noexceptmove操作,如果有的话,因为那时且只有那时容器会在内部真正move数据而不是复制。今天尝试时,我发现-std=c++1y(对于C++14)和g++-4.8没有区别。也许我错过了规范中的更新,也许我的示例是错误的。我比较了三种应该可以move的数据结构的区别默认情况下可按照“零规则”move可通过提供move操作来movewithoutnoexcept可通过noexcept提供move操作来move框架:#include#include#include#inclu

c++ - SFINAE : Detecting if a function is called by a compile time known value

我喜欢在我的一个ctors以编译时已知值被调用时做一些检查。有办法检测吗?所以当有人调用它时:Aa(10);因为10是编译时已知常量,所以我喜欢调用一个特殊的构造函数,如下所示:template>A(intValue){}知道如何解决这个问题吗?谢谢! 最佳答案 积分常量可以解决您的问题:structA{template*=nullptr>A(std::integral_constant){}};然后,你可以像这样使用它:Aa{std:integral_constant{}};为了便于使用,您还可以使用类似于boost::hana的

c++ - std::function 的移动赋值不是 noexcept,但 std::function::swap 是。是什么赋予了?

std::function在func.wrap.func中的概要告诉我们function&operator=(function&&);移动赋值运算符不是noexcept,禁止将其用于标准容器中的仅移动类型。但是!它还告诉我们voidswap(function&)noexcept;同样,默认的构造函数是function()noexcept;因此我们可以使用默认构造函数后跟交换来实现移动构造函数。因为我们可以用swap实现移动赋值运算符(swap有更强的后置条件):如何在std::function中实现noexcept交换?为什么std::function的移动赋值运算符不是noexcep

c++ - 为什么 std::move() 在 C++ 中工作?

以下是代码片段:inti=0;int&&k=std::move(i);在c++primer中移动是templatetypenameremove_reference::type&&move(T&&t){returnstatic_cast::type&&>(t);}据我所知,这个std::move模板会推导出一个类似的函数int&&move(int&t){returnstatic_cast(t);}作为比较并详细说明我的问题,考虑这样一个例子:inttest(intk){k=66;returnk;}intk;inta=test(k);上面的代码将被编译为:inttemp;//thetemp