草庐IT

std_logic

全部标签

c++ - 应该始终使用 std::endl 吗?

在C++Primer(第5版)一书的帮助下,我从C跳转到了C++,其中作者陈述如下:Programmersoftenaddprintstatementsduringdebugging.Suchstatementsshouldalwaysflushthestream.Otherwise,iftheprogramcrashes,outputmaybeleftinthebuffer,leadingtoincorrectinferencesaboutwheretheprogramcrashed.但网上的帖子表明情况并非如此;有人说不断刷新缓冲区对程序不利并导致性能问题。我的问题:什么时候应该使

c++ - std::map已知位置删除摊余的复杂度和红黑树重新着色的次数

std::map::erase(iterator)的复杂度以O(1)摊销(例如,参见here)。尽管标准库没有规定实现方式,但事实上,这意味着将红黑树所需的重新平衡操作数摊销为O(1)。实际上,关于红黑树的Wikipedia条目seemstoconfirmthis:Restoringthered–blackpropertiesrequiresasmallnumber(O(logn)oramortizedO(1))ofcolorchanges(whichareveryquickinpractice)andnomorethanthreetreerotations(twoforinserti

c++ - 当 std::stringstream 使用 ("some content"构造时,tellg() 的预期行为是什么,std::ios::in|std::ios::ate)?

我有以下令我惊讶的代码(使用libstdc++4.8)...#include#include#includeusingnamespacestd;intmain(){std::strings("somecontent");std::stringstreamss(s,std::ios::in|std::ios::ate);std::istream&file=ss;//ss.clear();Makesnodifference...std::cout...具有以下输出。tellg()pos:0此行为与使用std::ifstream(std::ios::ate)时不同。此行为是否正确/符合预期?

c++ - 组合 std::forward、std::move 和 volatile 时的意外返回类型

代码ongcc.godbolt.org.我创建了一个简单的类型特征来删除右值引用:templatestructremove_rvalue_reference{usingtype=T;};templatestructremove_rvalue_reference{usingtype=T;};templateusingremove_rvalue_reference_t=typenameremove_rvalue_reference::type;我用它来实现一个copy_if_rvalue(x)函数,其返回类型取决于传递的参数:templateconstexprautocopy_if_rva

c++ - 在共享模式下锁定的 std::shared_mutex 上调用解锁

C++17引入了std::shared_mutex类型。我一直在查看CppReference上的文档对产生未定义行为的情况特别感兴趣。在通读两种解锁方法(一种用于释放独占所有权,一种用于释放共享所有权)时,我注意到文档有一次有点含糊。对于std::shared_mutex::unlock_shared,文档说明(强调我的):Themutexmustbelockedbythecurrentthreadofexecutioninsharedmode,otherwise,thebehaviorisundefined.它清楚地表明调用unlock_shared必须先调用lock_shared因

c++ - std::forward_list::remove_if 谓词的要求

考虑这段代码:structT{boolstatus;UsefulDatadata;};std::forward_listlst;lst.remove_if([](T&x)->bool{returnx.status=!x.status;});即一次性切换状态和删除非事件元素。根据cppreference上面的代码似乎是未定义的行为(强调我的):templatevoidremove_if(UnaryPredicatep);p-unarypredicatewhichreturnstrueiftheelementshouldberemoved.Thesignatureofthepredicat

c++ - 为什么 std::sort 构造对象?

这个问题在这里已经有了答案:std::sortdoesnotalwayscallstd::swap(3个答案)关闭5年前。我创建了以下类来理解std::sort的行为:classX{public:X(inti):i_(i){}X(X&&rhs)noexcept:i_(std::move(rhs.i_)){mc_++;}X&operator=(X&&rhs)noexcept{i_=std::move(rhs.i_);ao_++;return*this;}voidswap(X&rhs)noexcept{std::swap(i_,rhs.i_);sw_++;}friendbooloperat

c++ - std::function 的移动赋值不是 noexcept,但 std::function::swap 是。是什么赋予了?

std::function在func.wrap.func中的概要告诉我们function&operator=(function&&);移动赋值运算符不是noexcept,禁止将其用于标准容器中的仅移动类型。但是!它还告诉我们voidswap(function&)noexcept;同样,默认的构造函数是function()noexcept;因此我们可以使用默认构造函数后跟交换来实现移动构造函数。因为我们可以用swap实现移动赋值运算符(swap有更强的后置条件):如何在std::function中实现noexcept交换?为什么std::function的移动赋值运算符不是noexcep

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-