草庐IT

c++ - 为什么 std::function 构造函数或赋值之间存在差异?

std::function类型删除构造函数定义为:templatefunction(Ff);赋值运算符定义为:templatefunction&operator=(F&&f);(来源cppreference)为什么构造函数通过值获取f,而operator=通过转发引用获取f? 最佳答案 我只能猜测,但我猜这是因为它被添加到C++而右值引用和转发引用被添加到语言中。因此其API的某些部分获得了转发引用,而另一些则没有。有一个小优点:如果F的复制构造函数可以扔而移动不能,std::function(F)可以保证不抛出,而std::fun

c++ - 使用最新的 C++ 以类型安全的方式从枚举中随机选择一个元素

有没有办法以类型安全的方式从枚举中随机选择一个元素?我能找到的最好的方法是引入一个终止符值作为枚举的最后一个元素,这样你就知道有多少个值,然后在你转换的适当范围内生成一个随机整数到枚举。但是终止符值不代表任何东西,所以你有一个无效的枚举值,这不是类型安全的。在最新的C++标准中有更好的方法吗? 最佳答案 这似乎是std::map的一个很好的用例std::mapnicer_enum{{"Do",3},{"Re",6},{"Mi",9}};std::coutsecond 关于c++-使用最新

c++ - 如何 move std::ostringstream 的底层字符串对象?

#include#includeusingnamespacestd;templatestringToString(constT&obj){ostringstreamoss;oss如何movestd::ostringstream的底层字符串对象? 最佳答案 标准说std::ostringstream::str()returnsacopy.避免这种复制的一种方法是实现另一个直接公开字符串缓冲区的std::streambuf派生类。Boost.IOStreams使这变得非常简单:#include#include#includenamesp

C++ 字符串小写与自定义语言环境

我一直在尝试使用不同的语言环境调用std::tolower(),但似乎出了点问题。我的代码如下:intmain(){std::locale::global(std::locale("es_ES.UTF-8"));std::thread(&function,this);//Repeatedsometimes//waitforthreads}voidfunction(){std::stringword="HeÉllO";std::transform(word.begin(),word.end(),word.begin(),cToLower);}intcToLower(intc){retur

c++ - 用于创建 integral_constants 的任意元组的通用实用程序

利用ScottSchurr'sstr_const我有一个constexpr字符串。classStrConst{public:templateconstexprStrConst(constchar(&str)[N]):str_(str),len_(N-1){static_assert(N>1,"notastring");}constexproperatorconstchar*()const{returnstr_;}constexprsize_tsize()const{returnlen_;}constexprcharoperator[](size_ti)const{returni我有另一

C++17 std::variant 头文件 (clang 6.0.0)

更新我将问题缩小到(可能!这还不完全清楚,甚至阅读了我能找到的关于该主题的所有内容)安装stdlibc++-7-dev会为我提供合适的(即C++17兼容)STLheader和库。这(同样,显然)与Ubuntu17.04(artful?)捆绑在一起,但不适用于xenial(Ubuntu16.04.3LTS),这就是我的我正在使用。我已经尝试下载单独的.deb包并安装它们,但它很快就会变成一个Unresolved依赖项的迷宫。如果有人能告诉我如何在16.04上安装libstdc++-7-dev,我将不胜感激。原始问题我刚刚通过包管理器(在theseinstructions之后)在Ubunt

c++ - 为什么使用 std::mutex 的函数会对 pthread_key_create 的地址进行空检查?

采用这个简单的函数,在由std::mutex实现的锁下递增整数:#includestd::mutexm;voidinc(int&i){std::unique_locklock(m);i++;}我希望这(在内联之后)以一种直接的方式编译为调用m.lock()增量i然后m.unlock().检查为最新版本的gcc和clang生成的程序集,但是,我们发现了一个额外的复杂问题。先拿gcc版本:inc(int&):moveax,OFFSETFLAT:__gthrw___pthread_key_create(unsignedint*,void(*)(void*))testrax,raxje.L2p

c++ - `std::stringstream::fail()` 读后写应该返回什么值? (海湾合作委员会与 clang )

考虑以下代码片段:#include#includeintmain(){std::stringstreamss;ss>s;ssclang++trunk打印出如下结果:ss.eof()=truess.good()=falsess.bad()=falsess.fail()=falsess.str()=12345onwandboxg++trunk打印如下结果:ss.eof()=truess.good()=falsess.bad()=falsess.fail()=truess.str()=12345onwandbox如您所见,ss.fail()的值在两个编译器之间是不同的。在这种情况下,标准对s

c++ - 为什么 std::span 缺少 size_type?

我一直在将使用我的自制span类的旧代码更新为更符合C++20std::span的代码,但我遇到了编译错误,因为std::span没有size_type而是有index_type。关于index_type是否应该签名的问题一直存在争议,但为什么要跳过size_type?这打破了期望容器(或类似容器的对象)具有size_type的通用代码。 最佳答案 原提案P1022R0,当它被称为array_view时,有一个size_type成员。它在第一次修订中被删除了P1022R1作为简化的一部分,因为当时不需要size()和元素访问,使用带

c++ - 一份拷贝如何使用 memcpy union 简单成员?

我不太确定关于memcpy和union普通成员的标准引用。考虑代码:structTest{union{void(*function_p)(void*);void(*function_p_c)(constvoid*);};Test(constTest&other){usingstd::memcpy;memcpy(&function_p,&other.function_p,sizeof(function_p));//?memcpy(&function_p_c,&other.function_p_c,sizeof(function_p_c));//??}};intmain(void){Tes