草庐IT

selectionStart-End

全部标签

c++ - 当调用带有警告 "control reaches end of non-void function"的函数时,会发生什么(实际上)?

我知道这条消息的含义,我只是想知道为什么它不是错误消息,而只是警告?在这种情况下会发生什么?例如,假设我有一个函数intf(){}当我调用它时会发生什么?在这种情况下,编译器是否添加了“未初始化”int的返回?或者缺少返回可能会导致堆栈损坏?或者它(绝对)未定义的行为?用gcc4.1.2和4.4.3测试编辑:阅读答案我明白一件事,阅读评论-另一件事..好的,让我们总结一下:这是未定义的行为。那么,这意味着可能导致堆栈损坏,对吗?(这甚至意味着,我的电脑可能开始通过麦克风插孔向我扔烂番茄,尖叫着——“你做了什么???”)。但如果是这样,那么为什么这里的最高答案说,堆栈损坏不会发生,同时行

c++ - 杀死魔数(Magic Number): "const int" vs "constexpr int" (or is there no difference in the end)

假设我有一个魔数(MagicNumber)我想摆脱...//whatever.cppfor(inti=0;i我可以通过两种方式杀死它:无论是constintSOMETHING_SOMETHING_MEANING_OF_LIFE=42或使用constexprintSOMETHING_SOMETHING_MEANING_OF_LIFE=42在源.cpp文件中。在这种情况下,两者之间是否有任何有意义的区别(我记得编译器推断-在任何一种情况下-值都不会改变,因此42实际上在结果循环中是硬编码的/展开循环/任何机器代码)还是归结为个人喜好?在一个相关问题中:如果magicnumber(以及替换它

c++ - 未取消引用的迭代器是否超过了数组未定义行为的 "one past-the-end"迭代器?

给定intfoo[]={0,1,2,3};我想知道指向“过去的最后一个”的迭代器是否无效。例如:autobar=cend(foo)+1;在Stack溢出问题中有大量提示和警告称这是“未定义的行为”,例如:c++what'stheresultofiterator+integerwhenpast-end-iterator?不幸的是,唯一的来源是挥手。我在购买时遇到了越来越多的麻烦,例如:int*bar;未初始化,但肯定不会调用未定义的行为,并且经过足够的尝试,我确信我可以找到一个实例,其中未初始化bar中的值与cend(foo)+1具有相同的值.这里最大的困惑之一是我不是询问解除引用cen

c++ - &*vector::end() 是未定义的行为吗?

我认为&*vector::end()是未定义的行为...直到我看到somepost引用Stroustrup'scode:voidvector_pointer_test(element_t*first,element_t*last,intnumber_of_times){vectorcontainer(first,last);//&*container.begin()getsusapointertothefirstelementsort(&*container.begin(),&*container.end());unique(&*container.begin(),&*containe

c++ - STL 算法中的 begin()、end() 烦恼

我喜欢STL算法,并且更喜欢使用算法而不是通常的循环。几乎所有的STL算法通常都被用作:std::algorithm_name(container.begin(),container.end(),.....)container.begin(),container.end()-是我的项目中最流行的词对之一。有人遇到同样的问题吗?请问各位大神是怎么解决这个问题的?你有什么建议来避免这种重复?我看到了几种解决方法,但它们都有不同的限制(宏用法,与通常的指针不兼容等)。 最佳答案 下一个C++标准C++0X(其中X代表,希望是9)将增加从迭

c++ - 带有 set 的 std::inserter - 插入到 begin() 或 end()?

这个问题在这里已经有了答案:Isthereadifferencebetweenusing.begin()vs.end()forstd::inserterforstd::set?(2个回答)关闭5年前。我有一些看起来像这样的代码:std::sets1,s2,out;//...s1ands2arepopulated...std::set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),std::inserter(out,out.end()));我读过插入可以在摊销的常数时间内完成,如果插入到集合中的值紧跟作为“提示”给出的迭代器。这

c++ - end() 可以是 STL 容器的 coSTLy 操作

开启https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html建议编写如下for循环:Container::iteratorend=large.end();for(Container::iteratorit=large.begin();it!=end;++it){//...;}而不是for(Container::iteratorit=large.begin();it!=large.end();++it){//...;}由于我很少在任何代码中看到这种风格,我想知道end()的连续调用是否真的为STL容器上的大型循环增

c++ - 是否允许 std::string 的 end+1 迭代器?

创建到end(str)+1的迭代器是否有效?对于std::string?如果不是,为什么不是?这个问题仅限于C++11及更高版本,因为在C++11之前,数据已经存储在一个连续block中以这种方式存储。我认为这可能会有所不同。std::string之间的显着差异和我推测的任何其他标准容器是它总是包含比它的size多一个元素。,零终止符,以满足.c_str()的要求.21.4.7.1basic_stringaccessors[string.accessors]constcharT*c_str()constnoexcept;constcharT*data()constnoexcept;1R

c++ - pIter != cont.end() 在 for 循环中的性能

我最近正在阅读HerbSutter的“ExceptionalC++”,我对他在第6项-临时对象中给出的特定建议表示严重怀疑。他提出在以下代码中查找不必要的临时对象:stringFindAddr(listemps,stringname){for(list::iteratori=emps.begin();i!=emps.end();i++){if(*i==name){returni->addr;}}return"";}作为示例之一,他建议在循环之前预先计算emps.end()的值,因为每次迭代都会创建一个临时对象:Formostcontainers(includinglist),calli

c++ - map.erase(map.end())?

考虑:#includeintmain(){std::mapm;m[0]=0;m[1]=1;m.erase(0);//okm.erase(2);//no-opm.erase(m.find(2));//boom!}(好的,所以标题谈到删除end()迭代器,但find将返回end()以获得不存在的键。)为什么删除不存在的keyOK,但删除end()却失败了。我在标准中看不到任何明确提及这一点?我已经在VS2005(在调试配置中抛出异常)和GCC4.0.1(100%CPU)上试过这个。是否依赖于实现?谢谢。 最佳答案 对于erase(key