草庐IT

c++ - 为什么 Boost.Spirit 正确地将标识符解析为 std::string,而不是解析为仅由 std::string 组成的适配结构?

我为标识符定义了一条规则:以字母字符开头,后跟任意数量的字母数字字符。当我直接解析为std::string与包含单个std::string的改编结构时,我得到不同的结果。如果我的语法属性是std::string,Qi会正确地将字符序列调整到其中。但是对于结构,只存储第一个字符。我不太确定这是为什么。(请注意,如果结构是“真正”改编的,或者它是由Fusion内联定义的,这没有区别。)这是一个SSCCE,可配置调试://Options://#defineDEFINE_STRUCT_INLINE//#defineDEBUG_RULE#defineBOOST_SPIRIT_USE_PHOENI

c++ - 程序以 std::bad_alloc 终止

我正在运行一个C++程序,它在任意点死于std::bad_alloc,这取决于指定的输入。以下是关于该计划的一些观察/要点:对于较短的运行(运行时间取决于输入),程序会正常完成。问题只出现在较大的运行中。该程序没有任何可检测到的内存泄漏。这已通过Valgrind/Memcheck进行了较小的运行检查。此外,我的整个代码没有任何指针(所有动态分配都是由库完成的,例如,在std::vector和std::string中;它是这些库类中的分配失败),因此内存泄漏的可能性极小。几个对象在循环中分配,然后移动到容器中。这些对象中有几个是为了在程序快结束之前一直存在。我怀疑堆碎片可能是个问题(请参

c++ - 我什么时候需要使用 std::async(std::launch::async, func()) 而不是 func()?

我不明白使用std::async的原因与std::lauch::async标志,而不是简单地调用传递给std::async的函数.是否有任何特价保证? 最佳答案 根据thedocumentation,是一个只接受函数及其参数的重载。您正在使用接受更具体的策略的重载。async(f,args...)等同于async(std::launch::async|std::launch::deferred,f,args...),其中两个标志的存在将函数是否简单地与当前调用堆栈分离(推迟到第一个非定时等待函数的执行;这称为惰性求值),或者实际上是

C++11 std::promise 从线程返回 std::string,数据指针看起来已复制未移动

我开始使用C++11标准和内置线程。根据我在获得future值时收集到的信息,它是使用移动运算符完成的,将所有权从原始对象中移走(就像旧的auto_ptr曾经在赋值时所做的那样)。我通过在线程期间打印出std::string对象内的char数组的指针并在main中接收到它后打印指针来测试这一点。但是,指针不同。如果有人能告诉我为什么他们在这个简单的代码中不同以及代码必须是什么样子才能使它们相等,我将不胜感激:#include#include#include#include#include#include#include#includeusingnamespacestd;voidthrf

c++ - 如何将对象移动到 std::async()?

我需要将一个对象移动到一个异步函数,让另一个函数管理我的资源。但这似乎很难。例如,我想将一个fstream发送到一个异步函数。voidasv(std::ofstreams){//dosomething.}我想:std::ofstreams("afs");std::async(asv,std::move(s));无法编译。但是std::ofstreams("afs");asv(std::move(s));可以编译。我该怎么做? 最佳答案 这才是正确的做法。(实际上没有什么可以添加到答案中)如果您使用Coliru之类的工具对其进行测试,

c++ - 将自定义类型作为 map 的可能键的可能方法有哪些

这个问题在这里已经有了答案:HowcanIusestd::mapswithuser-definedtypesaskey?(8个答案)关闭8年前。最近有人问我如何将自定义类型作为STL::map的可能键。直截了当我回答他们要重载“customtype链接”当他们问我还有哪些其他方法可以解决这个问题时。我只是暗示我们也可以通过重载“==”运算符来做到这一点。但他对这个答案并不满意。请帮助我知道,是否有任何其他方法可以解决这个问题“将自定义类型作为map的可能键”。

c++ - std::function 在调用内部可变 lambda 时是否锁定互斥量?

除非另有说明,否则C++标准库对其类型提供以下保证:(1)读取操作(即处理const对象)是线程安全的。这意味着只要没有线程同时写入(应用非const操作)对象,多个线程就可以同时从对象读取而不会出现竞争条件。(2)多个线程可以同时读写任意对象,只要每个对象一次最多只能被一个线程访问。标准库需要用户类型的相同保证。(您可以在GotW#95中阅读这些内容或观看HerbatC++andBeyond2012对此的解释。)现在我的问题是,如果下面的结论是正确的:因为std::function的operator()是一个const成员函数,它需要是线程安全的。如果在构造时传入的仿函数有一个con

c++ - 在默认参数中使用依赖范围作为 std::less 类型的编译错误

在我添加第二个参数以使其更通用之前,下面的怪物工作正常:templatetypenameIterableType::iteratorGetMinimum(IterableTypecollection,Comparatorcomparator=std::less){typenameIterableType::iteratoriter=collection.begin();typenameIterableType::iteratorresult=iter;for(;iter!=collection.end();++iter){if(comparator(iter,result))resul

c++ - 为什么 list<unique_ptr> 中的 unique_ptr 的 std::move() 没有真正 move 它?

usingPtr=std::unique_ptr;Ptrf(boolarg){std::listlist;Ptrptr(newint(1));list.push_back(std::move(ptr));if(arg){Ptr&&obj1=std::move(list.front());//Here|obj1|and|list.front()|stillpointtothesamelocation!list.pop_front();returnstd::move(obj1);}else{Ptrobj2=std::move(list.front());list.pop_front();r

c++ - 抛出并捕获 std::string

我编写了奇怪的代码,但令人惊讶的是它有效。但是现在我不知道我扔的是什么,我该如何接住它:classDate{private:intday;intmonth;intyear;intdaysPerMonth[];public:Date(intday,intmonth,intyear){intdaysPerMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};if(isValidDate(day,month,year)){this->day=day;this->month=month;this->year=year;}else{throwstd::s