草庐IT

c++ - 为什么 std::move() 在 C++ 中工作?

以下是代码片段:inti=0;int&&k=std::move(i);在c++primer中移动是templatetypenameremove_reference::type&&move(T&&t){returnstatic_cast::type&&>(t);}据我所知,这个std::move模板会推导出一个类似的函数int&&move(int&t){returnstatic_cast(t);}作为比较并详细说明我的问题,考虑这样一个例子:inttest(intk){k=66;returnk;}intk;inta=test(k);上面的代码将被编译为:inttemp;//thetemp

c++ - 返回对 std::unique_ptr 的引用的原因

我想知道在C++中是否有合理的理由通过引用返回唯一指针,即std::unique_ptr&?我以前从未真正见过这种技巧,但我的新项目似乎经常使用这种模式。乍一看,它只是有效地打破/规避了“唯一所有权”契约,使得无法在编译时捕获错误。考虑以下示例:classTmContainer{public:TmContainer(){//Createsomesortofcomplexobjectonheapandstoreunique_ptrtoitm_time=std::unique_ptr(newtm());//Storesomethingmeaningfulinitsfieldsm_time-

c++ - 模板类型的值,如 std::false_type

如果std::false_type是一个类型,这个类型的有效值是多少?如果我只想实现如下所示的返回类型为std::false_type的函数,我该如何实现?typenamestd::false_typeoperator()(){returndeclval();} 最佳答案 按照评论中的建议尝试returnstd::false_type{};或return{};。 关于c++-模板类型的值,如std::false_type,我们在StackOverflow上找到一个类似的问题:

c++ - 在结构中初始化数组

假设我们有一些模板化结构,有时它的模板应该是一个数组。如何在struct中初始化数组?这个templatestructA{Tx;A(Tx):x(x){}};inta[6];Ab(a);在编译期间产生错误:error:arrayinitializermustbeaninitializerlistA(Tx):x(x){}^UPD1.这个东西用在更完整的代码中:templatestructA{Tx;A(constT&x):x(x){}A(constT&&x):x(std::move(x)){}};templateA::type>make_A(T&&a){returnA::type>(std:

c++ - 函数参数评估顺序与 Lambda 捕获评估顺序

C++标准似乎函数参数求值的顺序以及lambda捕获初始值设定项的顺序未指定.(参见http://en.cppreference.com/w/cpp/language/lambda以及OrderofevaluationinC++functionparameters)这让我有些担心,因为它可能如何与move语义交互。假设我有一个T类型的对象,可能有一个抛出的复制或move构造函数。然后假设我有一个只能move的对象,例如std::promise。考虑以下情况:Tvalue;//sometypethatpotentiallythrowswhenmovedorcopiedpromisepr;

c++ - std::regex 和双 ABI

今天我发现了一个有趣的案例,双libstdc++ABI影响库的兼容性。长话短说,我有两个库都在内部使用std::regex。一个是使用CXX11ABI构建的,一个不是。当这两个库在一个可执行文件中链接在一起时,它会在启动时崩溃(在输入main之前)。这些库是不相关的,并且不公开提及任何std::类型的接口(interface)。我认为这样的库应该不受双重ABI问题的影响。显然不是!问题可以通过这种方式轻松重现://file.cc#includestaticstd::regexfoo("(a|b)");//main.ccintmain(){}//build.shg++-onew.ofil

c++ - std::vector::assign/std::vector::operator=(const&) 是否保证重用 `this` 中的缓冲区?

如果我将一个vector分配或复制到另一个vector(其容量与前者的大小相同或更大),我可以假设后者的缓冲区将被重用吗?下面的例子证明我可以,但是,标准保证吗?std::vector::assign和std::vector::operator=在这方面的行为有什么不同吗?#include#include#includeintmain(){std::vectora{1,2,3,4,5};std::vectorb{1,2,3,4};std::vectorc{1,2,3,4,5,6,7,8,9,10};std::coutLiveexample.更新:Thisanswer提到voidassi

c++ - is_assignable 和 std::unique_ptr

Here是来自gcc的测试文件,livedemostructdo_nothing{templatevoidoperator()(T*){}};intmain(){inti=0;std::unique_ptrp1(&i);std::unique_ptrp2;static_assert(!std::is_assignable::value,"");//note!here.}std::is_assignableIftheexpressionstd::declval()=std::declval()iswell-formedinunevaluatedcontext,providesthemem

c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?

std::atomicg_atomic;voidthread0(){intoldVal=0;intnewVal=1;while(g_atomic.compare_exchange_strong(oldVal,newVal,std::memory_order_acq_rel,std::memory_order_acquire)){//forevercountingfrom0to100untilunexpectedvalueappearsoldVal=newVal;newVal=(oldVal+1)%100;};}voidthread1(){//setunexpectedvalueg_at

c++ - 判断是否有为特定类型的参数定义的重载函数

我有一个简单的序列化框架,它定义了各种类型的读写模板函数的特化,包括算术、我的类和标准容器,如vector、数组、映射等......,所以可以做std::vectorv{"a1","b123","c12345"};Read(stream,v);Write(stream,v);或std::mapm;Read(stream,m);Write(stream,m);,例如。我正在寻找一种方法来确定在编译时是不是可序列化的类型,方法如下:templateconstexprboolis_serializable(){if(ReadandWritearedefined)returntrue;retu