草庐IT

c++ - 从 VS 2012 中的 lambda 返回值构造 std::function 时崩溃

此C++代码使用VS2012成功编译但在运行时崩溃:#include#includevoidf(){std::coutfilter(get_f());//crashhere!!!return0;}如果我们将get_f更改为:autoget_f=[](){returnf;};然后程序运行没有崩溃。是这段代码的问题还是编译器/标准库的bug?我没有使用较新版本的VisualStudio进行测试。 最佳答案 在我看来,这像是标准库(或可能是编译器)的问题。使用VS2013,它可以毫无问题地编译和运行。如果我们添加代码来调用同样运行的fil

c++ - 如何将 std::bind 作为通用引用类型传递?

据我了解,std::bind完美地转发它包装的可调用对象和该可调用对象的参数;std::bind返回对象本身是可移动和/或可复制的,具体取决于可调用对象及其参数是否可移动和/或可复制;一个std::bind返回对象可能是嵌套的,在这种情况下,外部std::bind返回对象是可移动和/或可复制的,就像绑定(bind)其他可调用对象时一样。因此,我希望下面的代码片段可以正常编译。相反,代码在main()中的最后两个语句中生成了大量编译器错误。.#includetemplatevoidcall_handler(HandlerType&&handler){handler();}template

c++ - std::string 到 float (通过 std::stof)精度

我正在尝试解决这个问题,市场数据以字符串形式返回货币值,该字符串在数字长度后8位。money="124.19000540"我需要它是124.19,知道如何实现吗?std::stof(money)=124.19000244如何克服这个问题? 最佳答案 浮点类型不适合保存货币值。如果您满足于四舍五入到美分,并将钱存储为美分的整数(这是最简单的解决方案之一),您可以这样做:longnumCents=static_cast(100*std::stof(money))这将进行“截断”舍入,它总是向下舍入。如果您想“四舍五入到最接近的美分”,请

c++ - 我是否正确理解了 Scott Meyers 的 std::weak_ptr 示例的要点?

EffectiveModernC++(第136页)使用以下示例来激发std::weak_ptr。缓存被定义为一个无序的映射,具有指向对象的弱指针作为值。每当此缓存的客户端请求一个对象(通过键)时,就会查找相应的弱指针并在其上调用lock()。如果生成的std::shared_ptr不是null,则返回它。否则,对象从外部数据库重新加载,进入缓存并返回std::shared_ptr。现在的问题是:人们可能认为可以在没有std::weak_ptr的情况下实现这一点,而是将强共享指针存储为缓存值。如果强指针的use_count()为1,则表示客户端的所有指针都已销毁。这个例子的重点是使用st

c++ - 如何将 `std::vector` 成员变量 move 到方法的调用者?

请考虑以下代码classA{public:A(std::size_td):m_v(d)std::vectoroperator()(){returnm_v;}private:std::vectorm_v;};我想movem_v给operator()的来电者而不是复制它。我需要做什么?简单地写returnstd::move(m_v)并将返回类型更改为std::vector&&? 最佳答案 写returnstd::move(m_v)就够了。 关于c++-如何将`std::vector`成员变量

c++ - 为什么 std::shuffle 和 std::sort 一样慢(甚至慢)?

考虑测量执行时间和执行交换次数的简单代码:#include#include#include#include#includestructA{A(inti=0):i(i){}inti;staticintnSwaps;friendvoidswap(A&l,A&r){++nSwaps;std::swap(l.i,r.i);}booloperatorv(10000000);std::minstd_randgen(std::random_device{}());std::generate(v.begin(),v.end(),[&gen](){returngen();});autos=high_re

c++ - 可变参数模板构造中的隐式 std::pair 构造

我有一个constexpr键值映射,大致具有以下定义://mapwith`pos`remainingentriestemplateclassMap{public:templateconstexprMap(Headhead,Tail...tail):value{head},tail{tail...}{}Elementvalue;constMaptail;//membersetc};//mapendelement.templateclassMap{public:constexprMap(){}//endelementspecifics.};为了在编译时初始化键值映射,我有一个转发元素的实用

c++ - 通过 std::rel_ops 特化 std::greater

我如何专攻std::greater通过使用std::rel_ops?我有这样的东西#include#includeusingnamespacestd::rel_ops;structMyStruct{intfield;booloperator所以我需要按降序对元素进行排序。我如何使用operator来做到这一点,std::rel_ops和std::greater? 最佳答案 我假设你试图做类似的事情MyStructms[]={{10},{50},{30},{20}};std::sort(std::begin(ms),std::end(

c++ - 用于 Arduino IDE (xtensa-lx106-elf-gcc) 和 std::map 链接错误的 ESP8266

是否可以将ESP8266的map用于Arduino包?这是我的代码:#includetypedefstd::mapItems;voidsetup(){Itemsitems;items[2]=5;//items.emplace(4,5);}voidloop(){}这是编译/链接错误:Arduino:1.6.5(Windows8.1),Board:"GenericESP8266Module,Serial,80MHz,40MHz,DIO,115200,512K(64KSPIFFS)"sketch_oct31a.cpp.o:Infunction`loop':C:\ProgramFiles(x8

使用 std::atomic 的 C++ 线程安全增量,带模而不带互斥锁

我需要一个以循环方式使用的线程安全缓冲区对象池。我通常会在其中放置一个互斥锁以使增量和模线程安全,但是是否可以使用std::atomic来编写它?这是一个示例界面。如果它使事情变得更容易,缓冲区的总数可以是2的幂。永远不会在类外访问下一个缓冲区索引。classBuffer;classBufferManager{public:BufferManager(size_ttotalBuffers=8):mNextBufferIndex(0),mTotalBuffers(totalBuffers){mBuffers=newBuffer*[mTotalBuffers];}Buffer*GetNex