草庐IT

move_wrapper

全部标签

c++ - std::optional<std::reference_wrapper<T>> - 可以吗?

是std::optional>是否符合C++17的标准(或草案)?标准明确指出,引用类型的std::optional格式错误。但它是否包括reference_wrapper? 最佳答案 是的。那没问题。它不包括reference_wrapper因为reference_wapper不是引用类型。只有实际的引用类型是不允许的。 关于c++-std::optional>-可以吗?,我们在StackOverflow上找到一个类似的问题: https://stackov

c++ - 为什么 std::move 将右值引用作为参数?

根据cppreference.com,move有签名templatetypenamestd::remove_reference::type&&move(T&&t)noexcept;为什么它需要一个右值引用T&&t作为它的参数?同样当我尝试下面的代码时voidfoo(int&&bar){cout我收到编译器错误“右值引用不能绑定(bind)到左值”这是怎么回事?我很困惑。 最佳答案 这不是一个右值引用,而是一个forwardingreference;这可以保留参数的值类别。这意味着std::move可以接受左值和右值,并将它们无条件地

c++ - 在线程之间 move vector

我有一个线程使用这样的公共(public)接口(interface)不断收集数据项:classMyThread{public:classItem{//...};startup();shutdown();boolhasItems()const;//retrievecollecteditemsstd::vector&&items();private:std::mutexitemMutex;std::vectorcurrentItems;};检索项目还应该清除线程​​的项目列表。我返回一个右值,以便在调用方调用move构造函数。当然,检索项目应该是线程安全的,因此实现如下所示:std::ve

c++ - 混合 std::move() 和 std::thread 不会编译

代码如下:#include#includeclassA{voidfoo(int&&arg)const{}voidboo()const{intvalue(0);std::threadt(&A::foo,this,std::move(value));t.join();}};intmain(){Aa;return0;}MSVisualStudio2012(工具集v110)给出下一个错误:errorC2664:'_Rxstd::_Pmf_wrap::operator()(const_Wrapper&,_V0_t)const':cannotconvertparameter2from'int'to

c++ - vector move 构造函数比复制构造函数慢

我正在开发我的第一个C++项目,它是一个CSV解析器(fullsourcecodehere)。它正处于工作状态,现在我想进行基本的重构/提高性能。目前解析器的工作方式是将每一行作为std::vector返回,我想与其每次都分配一个新的vector和一个新的字符串,不如我有一个内部vector和一个带有保留内存的内部字符串,我会一次又一次地清除。这行得通,我开始查看其他可能进行内存分配的地方,我看到了这个复制内部vector然后清除它的函数:autoadd_row()->std::vector{autorow(m_bufvec);m_bufvec.clear();returnrow;}我

c++ - reference_wrapper : make_pair VS Class Template Argument Deduction (CTAD)

为什么make_pair和类模板参数推导(CTAD)不同意生成哪种类型?#include#include#include#includeintmain(){intmyInt=5;std::reference_wrappermyIntRef=myInt;automyPair=std::make_pair(myInt,myIntRef);std::pairMy2ndPair(myInt,myIntRef);std::cout输出:St4pairIiRiE//std::pairSt4pairIiSt17reference_wrapperIiEE//std::pair>更新:为什么std::p

c++ - 为什么我可以 std::move 流右值引用到左值引用?

据我了解C++11引用,我不应该能够将右值引用绑定(bind)到(非常量)左值引用,因为前者可能绑定(bind)到临时对象,而后者绝不能绑定(bind)到一个临时的。但是我发现这种奇怪的行为与临时流对象有关(我尽可能地减少了)structDummy{};templateStream&operatorvoidpass(Stream&&s){std::move(s)lvalueconversion?}#includeintmain(){pass(std::fstream("test",std::ios::out));}如果我写s在线(X),C++在(A)行提示,说error:invalid

c++ - 如何在编译时检测 C++ 中的 std::reference_wrapper

假设我们有一些可变参数模板,需要以不同方式处理std::reference_wrapper参数。我们怎样才能做到这一点? 最佳答案 你可以做一个特征来判断一个类型是否是reference_wrappertemplatestructis_reference_wrapper:false_type{};templatestructis_reference_wrapper>:true_type{};然后你可以用它来消除歧义:templatevoiddo_stuff(T&&t,false_type){coutvoiddo_stuff(T&&r

c++ - 使类不可 move 的用例(如果有)是什么?

考虑一种使类不可复制的经典方法://similartoboost::noncopyableclassnoncopyable{protected:constexprnoncopyable()=default;noncopyable(constnoncopyable&)=delete;noncopyable&operator=(constnoncopyable&)=delete;};classc:privatenoncopyable{/*...*/};由于声明任何复制操作会阻止自动生成move操作,这会自动使所有派生类(默认情况下)也不可move(因此noncopyable的全名将是non

c++ - 在 C++11 中,虚函数能否通过 move 语义有效地返回一个大值?

通常,这会被优化为不涉及复制大值(因为std::vector启用了move语义):std::vectormakeABigThing(){std::vectorlarge_thing(1000,0);returnlarge_thing;}如果函数是虚方法,是否也可以用同样的方式优化:structFoo{virtualstd::vectormakeABigThing(){std::vectorlarge_thing(1000,0);returnlarge_thing;}};即,即使在运行时选择了被调用的函数,move语义是否也适用? 最佳答案