草庐IT

move_function_imp

全部标签

c++ - 在 C++11 中抛出异常时是否使用 move 语义?

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4在这篇文章中,HerbSutter解释说抛出异常需要异常的拷贝,因为它是作为临时创建的,因此使用std::auto_ptr来绕过复制开销。鉴于move语义在C++11中可用,这仍然是必要的吗? 最佳答案 我刚查过,标准允许省略将throw表达式的操作数指定的对象复制或move到异常对象中如果您不以其他方式改变程序的含义(即如果您重新抛出并且随后的捕获会突然看到一个由前

c++ - 我们应该在何时、何地以及为什么使用 "BigObject&& rv = std::move(big_obj);"?

我的编译器是最新的VC++2013预览版。#includestructBigObject{...};voidf(BigObject&&){}voidf(BigObject&){}voidf(BigObject){}intmain(){BigObjectbig_obj;BigObject&r1=big_obj;//OK.BigObject&&r2=big_obj;//errorC2440BigObject&&r3=std::move(big_obj);//OK.BigObject&&r4=r3;//errorC2440f(r3);//errorC2668:'f':ambiguouscal

c++ - move 哪个 throw ?

据我了解,move构造函数和move赋值必须标记为noexcept,以便编译器在例如在vector内部重新分配时使用它们。但是,是否存在move分配、move构造可能实际抛出的真实案例?更新:例如,在构造时具有分配资源的类不能是不可抛出的。 最佳答案 However,isthereanyreal-worldcasewhereamove-assign,move-construct(orswap)mightactuallythrow?是的。考虑std::list的实现.end迭代器必须指向列表中的“最后一个元素”。存在std::list

c++ - std::function 的模板参数(签名)不是其类型的一部分吗?

给定以下代码,歧义背后的原因是什么?我可以规避它还是必须保留(烦人的)显式转换?#includeusingnamespacestd;inta(constfunction&f){returnf();}inta(constfunction&f){returnf(0);}intx(){return22;}inty(int){return44;}intmain(){a(x);//Callisambiguous.a(y);//Callisambiguous.a((function)x);//Works.a((function)y);//Works.return0;}有趣的是,如果我注释掉a()功

c++ - <function> 不是 <class> 的成员

我已将我的函数“Credit”声明为带有一些参数的私有(private)成员。我的观察是,每当我尝试不带任何参数进行编译时,编译器都会成功编译。但是一旦我用函数中的参数进行编译,编译器就会报错'Transaction::Credit'isnotamemberof'Transaction'这是我的代码classTransaction:publicMenu{private:voidCredit(intdepost);//{return0;}public:voidDeposit();voidWithdraw(){}voidTransfer(){}};voidTransaction::Depo

c++ - 为什么 g++ 声明某些 valarray<double> o 有 "no matching function for call cbegin(o)"?

请考虑以下代码:usingcustom_t=std::valarray;custom_to;unsignedacc=std::accumulate(std::cbegin(o),std::cend(o),0);g++-5说Nomatchingfunctionforcalltocbegin(custom_t&)如果我改用std::begin(o)和std::end(o),一切正常。这是编译器错误吗?代码使用VisualStudio2015编译。 最佳答案 这是一个libstdc++错误,我刚刚创建了https://gcc.gnu.or

c++ - std::function 参数列表和 typedef

我有一个类似这样的typedef:typedefstd::functionMyFunction;在我的代码中某处是这样使用的:MyFunctionfunc=[](intarg1,floatarg2){/*dosometing*/};问题是,每次我更改函数的参数数量(例如,我添加第三个参数chararg3)时,我都被迫在我使用MyFunction的所有代码中更新它(即使这些根本不使用参数。而且我懒得那样做。有没有办法从它的类型中获取std::function的参数列表?(我的意思是)这样函数创建看起来像那样?:MyFunctionfunc=[](MyFunction::args){/*d

c++ - 将 C++11 move 语义应用于绑定(bind)函数

我有一些现有的C++98代码,它们使用boost::function和boost:bind进行异步回调。一些相关的简化代码片段包括:typedefboost::functionWriteHandler;structWriteOperation{WriteOperation(constboost::shared_ptr&device,conststd::string&data,constWriteHandler&handler):m_Device(device),m_Data(data),m_Handler(handler){}private:boost::shared_ptrm_Dev

c++ - 在没有 move 构造函数的情况下返回不可复制对象的解决方法

在我的API中,我有一个返回std::istringstream的函数.std::istringstreamclass是不可复制的,但支持move,因此在符合标准的编译器上返回本地没有问题std::istringstream.但是,在gcc4.9上,有nosupportmovestd::istringstream.有没有我可以使用的解决方法std::istringstream无需从用户的角度更改API?建议的解决方法here,使用unique_ptr将改变API的语义。 最佳答案 如果你不能movestd::istringstrea

c++ - 调用时为 std::function 分配新值

inti=9;struct_variable.f=[i](Tstruct_variable&){do_something_with_capture_variable(i);...struct_variable.f=another_compatible_std_function;//dosomethingelse,butneverusecapturedvariableafterhere...};struct_variable.f(struct_variable);lambda函数被保存为成员struct_variable.f(也是类型std::function),在回调中,struct_