草庐IT

-std=gnu99

全部标签

c++ - 我什么时候应该使用 std::async with sync 作为策略?

std::async有一个重载,它将std::launch策略作为第一个参数。我什么时候应该使用这个重载?有哪些不同的政策?(我认为同步和异步是两个选项)。我什么时候应该使用同步策略?这与直接运行它有何不同? 最佳答案 摘要来自theveryhelpfularticlethatJagannathlinked,以及对可能用途的评论。有3种启动策略:any:库选择是否生成线程a或notasync:你明确要求产生一个线程deferred:你明确要求生成一个线程不因此,deferred政策是一种获得确定性惰性评估(也称为按需调用)的方式。例

c++ - 为什么在使用 std::bind 时复制构造函数被调用两次?

我正在研究std::function和std::bind以了解如何复制参数以及我是否可以保存一些复制操作。我知道在使用std::bind时,参数是按值而不是引用传递的(除非指定了std::ref)。但是,当我运行以下代码片段时,复制构造函数被调用了两次。谁能解释一下为什么?structtoken{staticinti;intcode;token():code(i++){cout(std::bind(&call_boo,t2));cout(std::bind(&call_boo,std::ref(t2)));cout(std::bind(&call_boo,std::move(t2)))

c++ - constexpr 上下文中的 std::optional 赋值运算符

我在std::optional上摸不着头脑,根据thedocs,不应有constexpr赋值运算符。但是,当我在gcc-8.1中尝试这个片段时,它编译并工作得很好:constexprstd::optionalfoo(){std::optionalbar=3;bar=1337;returnbar;}constexprautoz=foo();有什么我想念的吗? 最佳答案 这似乎是gcc中的一个错误。我刚刚在clang-6.0中尝试过,编译失败并出现预期错误。此外,该标准没有提及赋值运算符的任何constexpr重载,因此我会将此错误报告

c++ - glibcxx STL 在其 std::valarray::sum() 的实现中是否不正确?

我在玩弄valarrays当我碰到某些东西时,我认为是编译器的STL实现中的错误。这是我可以制作的最小示例:#include#include#include#include#includeusingnamespacestd;intmain(){valarrayY(0xf00d,1);valarray>X(Y,1);cout这将输出:$g++-std=c++17-O2-Wall-pedantic-pthreadmain.cpp&&./a.outY[0]=f00dX[0][0]=f00dX[0].size()=1X.sum().size()=0您可以在coliru编译并运行它为什么我认为这

c++ - 从 std::string 流式传输而不制作拷贝?

我有一个网络客户端,其请求方法采用std::streambuf*。此方法通过boost::iostreams::copy实现-将其转换为自定义std::streambuf-知道如何将数据写入网络API的派生类,效果很好。这意味着我可以将文件流式传输到请求中,而无需将其全部读入内存。然而,在某些情况下,必须发送不在文件中的大数据block,因此我包含了一个采用字符串的重载。为了避免重复流中的所有网络代码,显然我应该设置一个表示字符串的streambuf并调用其他方法。我想出的唯一方法是:std::istringstreamss(data);send(ss.rdbuf());不幸的是,is

c++ - std::stringstream 可以设置失败/坏位的方法?

我用于简单字符串拆分的一段常见代码如下所示:inlinestd::vectorsplit(conststd::string&s,chardelim){std::vectorelems;std::stringstreamss(s);std::stringitem;while(std::getline(ss,item,delim)){elems.push_back(item);}returnelems;}有人提到这会默默地“吞下”std::getline中发生的错误。当然,我同意是这样的。但我突然想到,在实践中这里可能会出现什么问题,我需要担心。基本上这一切都归结为:inlinestd::

c++ - 奇怪的 std::bad_alloc

据我所知,可以抛出std::bad_alloc的三个原因:进程请求的内存多于可提供的内存地址空间过于分散,无法满足对大块连续内存的请求堆管理数据结构已损坏我们的代码会遇到std::bad_alloc,但上述原因似乎都不适用。数据结构是一个存储为顶点std::list的图,其中每个顶点再次存储一个std::list的边,它是其中的一部分以及一些连续的数据。对于小图(由于在较大的block中分配更多内存时没有问题,因此应排除上述原因1.和2.。在某些部分,我们以一种非常容易出错的方式使用指针,因此我们可能会破坏堆数据结构。但是当在较小的实例上运行时,valgrind的memcheck报告我

c++ - 我可以始终使用 std::inserter(container, container.end()) 而不是 std::back_inserter(container) 吗?

std::back_inserter仅适用于带有push_back的容器,因此它不适用于set和map另一方面,std::inserter适用于所有容器类型。那么我可以一直使用std::inserter(container,container.end())吗?那么下面的代码是否适用于所有类型的容器?templateTContainercreate(TElementelement){TContainercontainer;autoinserter=std::inserter(container,container.end());for(inti=0;i>(1);create>(1);

c++ - 在新版本的 gcc 上返回隐式不可复制结构的 std::map 时出现编译错误

我在新版本的gcc(4.9+)上遇到了这个奇怪的编译错误。代码如下:#include#include#include#include#includeusingnamespacestd;structptrwrap{unique_ptrfoo;};templatestructholder{holder()=default;holder(constholder&b):t(b.t){}holder(holder&&b):t(std::move(b.t)){}holder&operator=(constholder&h){t=h.t;return*this;}holder&operator=(h

c++ - 在 std::map 中查找具有给定前缀的键或在 std::set 中查找元素的优雅方法

我有map,其中的键是std::string。我想在map中找到那些以"DUPA/"前缀开头的元素。找到下界很容易,但上界有点问题。我写了这样一段代码:constchar*prefix="DUPA/";constchar*firstAfterPrefix="DUPA0";autoprefixedBeginIt=myMap.upper_bound(prefix);autoprefixedEndIt=myMap.lower_bound(firstAfterPrefix);代码工作正常,但我认为它不够优雅,因为必须知道0在ASCII表中位于/的第一个。第二种方法是复制前缀并增加最后一个符号。