草庐IT

c++ - 如何从移动捕获 lambda 表达式创建 std::function?

我正在尝试创建一个std::function来自移动捕获lambda表达式。请注意,我可以毫无问题地创建移动捕获lambda表达式;仅当我尝试将其包装在std::function中时我得到一个错误。例如:autopi=std::make_unique(0);//noproblemshere!autofoo=[q=std::move(pi)]{*q=5;std::coutbar=foo;std::functionbar{foo};std::functionbar{std::move(foo)};std::functionbar=std::move(foo);std::functionba

c++ - 将函数标识符作为右值引用传递并对其应用 std::move()

考虑以下片段#include#includeusingcallback=std::function;doublesum(doublea,doubleb){returna+b;}intmain(intargc,char*argv[]){//Shouldn'tthisleavesum()inaninvalidstate?autoc=std::move(sum);std::cout我正在将sum转换为右值引用,将其存储在c中,并在没有明显错误行为的情况下调用这两个函数。这是为什么?std::move不应该让sum处于无效状态吗? 最佳答案

c++ - std::vector 应该尊重 alignof(value_type) 吗?

如果我定义一个具有特定对齐要求的简单类型,该类型的std::vector难道不应该为每个元素遵守对齐吗?考虑下面的例子typedefstd::arrayalignas(32)avx_point;std::vectorx(10);assert(!(std::ptrdiff_t(&(x[0]))&31)&&//assertthatx[0]is32-bytealigned!(std::ptrdiff_t(&(x[1]))&31));//assertthatx[1]is32-bytealigned我发现clang3.2(带或不带-stdlib=libc++)悄悄地(没有任何警告)违反了对齐要求

c++ - 获取 UTF-8 编码的 std::string 的实际长度?

我的std::string是utf-8编码的,很明显,str.length()返回了错误的结果。我找到了此信息,但不确定如何使用它来执行此操作:Thefollowingbytesequencesareusedtorepresentacharacter.ThesequencetobeuseddependsontheUCScodenumberofthecharacter:0x00000000-0x0000007F:0xxxxxxx0x00000080-0x000007FF:110xxxxx10xxxxxx0x00000800-0x0000FFFF:1110xxxx10xxxxxx10xxx

c++ - std::hardware_destructive_interference_size 的可靠性

C++17引入了常量,这似乎对缓存感知编程很有用:https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_sizeinlineconstexprstd::size_thardware_destructive_interference_size,inlineconstexprstd::size_thardware_constructive_interference_size尽管我想知道它们的可靠性如何?是否保证以后不会有相同CPU架构内具有其他缓存线大小的新CPU型号?即x64缓存行大小为64字

c++ - 如何让 boost::iostream 以类似于 std::ios::binary 的模式运行?

我有以下关于boost::iostreams的问题。如果有人熟悉编写过滤器,我将非常感谢您的建议/帮助。我正在编写一对多字符过滤器,它们与boost::iostream::filtering_stream一起用作数据压缩器和解压缩器。我从编写压缩器开始,从lz系列中学习了一些算法,现在正在研究解压缩器。简而言之,我的压缩器将数据拆分为数据包,这些数据包分别编码,然后刷新到我的文件中。当我必须从我的文件中恢复数据时(在编程术语中,接收一个read(byte_count)请求),我必须读取一个完整打包block,缓冲它,解压它,然后才给出请求的字节数。我已经实现了这个逻辑,但现在我正在努力

c++ - "constify" `std::pair` 的字段是否可以不被黑客攻击?

在C++中,编译如下代码:std::pairx;static_cast*>(&x);报错:error:invalidstatic_castfromtype‘std::pair*’totype‘std::pair*’我或多或少理解为什么会这样,因为在模板参数列表中对类型进行cv限定原则上可以给出“不兼容”的结果。即使在这种情况下它不知道,编译器也无法知道。无论如何,是否有一种非hackish的方式来执行此转换?我对使用reinterpret_cast持谨慎态度对于我之前遇到过的类型双关问题。另外,我不能使用临时变量,因为这是对性能至关重要的代码。编辑:这就是我正在做的。我正在实现与std

c++ - boost::fusion::for_each 中的函数对象不同于 std::for_each

在升级到更新的编译器并解决编译器错误时,我意识到boost::fusion::for_each要求传入的函数对象具有运算符const。示例来自Boost:structincrement{templatevoidoperator()(T&t)const{++t;}};...vectorvec(1,2);for_each(vec,increment());这当然没有改变。我没有意识到它与std::for_each不同,它不要求运算符是const。structincrement{templatevoidoperator()(T&t)//noconsthere!!!{++t;}};std::v

map - C++ wcout std::map 值

我有一个名为“提示”的std::map,声明如下:std::map,std::allocator>>prompts;它存储int'key'和wstring'value'对。如果我这样做:wcoutget_state()];编译器(vc10)提示errorC2679:binary''(orthereisnoacceptableconversion)我必须做什么才能使map返回的wstring值用wcout打印?某种类型转换?或者……? 最佳答案 在第一行中,您缺少一个std::std::mapstd::wstring,std::les

c++ - std::function:参数的严格编译时验证

我想实现一个类,它包含两个带有预定义函数签名的回调。该类具有模板化构造函数,它使用std::bind来创建std::function成员。我预计编译器(g++4.6)会提示如果将签名错误的函数传递给ctor。但是,编译器接受以下内容:callbackc1(i,&test::func_a,&test::func_a);我能理解它为什么这样做。我试图为static_assert构造一个适当的条件,但没有成功。如何通过编译时错误来避免这种情况?#includeusingnamespacestd::placeholders;classcallback{public:typedefstd::fu