例如:if(true)try{//worksasexpectedwithbothtrueandfalse,butisitlegal?}catch(...){//...}换句话说,将try-block放在if条件之后是否合法? 最佳答案 tryblock(在C++中是statement)的语法是trycompound-statementhandler-sequence而if的语法是:attr(optional)if(condition)statement_trueattr(optional)if(condition)statement
这个问题在这里已经有了答案:CanmainfunctioncallitselfinC++?(9个回答)关闭4年前。我读到C++标准在main()中禁止递归,但是g++编译下面的代码毫无怨言:intmain(){main();}谁能澄清一下? 最佳答案 根据3.6.1/3中的标准,不是:Thefunctionmainshallnotbeused(3.2)withinaprogramused的定义是:Anobjectornon-overloadedfunctionisusedifitsnameappearsinapotentially-
来自[5.3.3/1],我发现:The sizeof operatorshallnotbeappliedtoanexpressionthathasfunctionorincompletetype来自[3.9/5]我发现:Incompletely-definedobjecttypesand cvvoid are incompletetypes无论如何,对于sizeof不评估它的操作数,我会说sizeof(void())是一个合法的表达式(实际上是GCC编译它和结果是1)。另一边,来自here,在讨论sizeof时没有提到void,既没有提到大小为1的类型,也没有在具有实现定义的列表中大小
例如,考虑以下结构:structS{inta[4];intb[4];}s;写s.a[6]并期望它等于s.b[2]是否合法?就个人而言,我觉得它必须是C++中的UB,而我不确定C。但是,我没有找到任何与C和C++语言标准相关的内容。更新有几个答案建议确保没有填充的方法字段之间,以使代码可靠地工作。我想强调如果这样的代码是UB,那么没有填充是不够的。如果是UB,那么编译器可以自由假设对S.a[i]和S.b[j]的访问不会重叠并且编译器可以自由地重新排序此类内存访问。例如,intx=s.b[2];s.a[6]=2;returnx;可以转化为s.a[6]=2;intx=s.b[2];retur
当我在程序中调用start()方法第二次时,以下代码导致java.lang.IllegalThreadStateException:Threadalreadystarted。updateUI.join();if(!updateUI.isAlive())updateUI.start();这发生在updateUI.start()被调用的秒次。我已经多次遍历它,并且在点击updateUI.start()之前调用了线程并完全运行到完成。调用updateUI.run()可以避免错误,但会导致线程在UI线程中运行(调用线程,如SO上的其他帖子中所述),这不是我想要的。一个线程可以启动一次吗?如果是
TheC++ProgrammingLanguage第4版,第225页写道:编译器可以重新排序代码以提高性能,只要结果与简单执行顺序的结果相同。一些编译器,例如Release模式下的VisualC++,将重新排序此代码:#include...autot0=clock();autor=veryLongComputation();autot1=clock();std::cout变成这种形式:autot0=clock();autot1=clock();autor=veryLongComputation();std::cout保证与原始代码不同的结果(报告的时间为零与大于零)。见myotherq
比较悬空指针是否合法?int*p,*q;{inta;p=&a;}{intb;q=&b;}std::cout注意p和q如何指向已经消失的对象。这合法吗? 最佳答案 简介:第一个问题是使用p的值是否合法。a被销毁后,p获取所谓的无效指针值。引自N4430(有关N4430状态的讨论,请参见下面的“注释”):Whentheendofthedurationofaregionofstorageisreached,thevaluesofallpointersrepresentingtheaddressofanypartofthedeallocat
无论代码有多“糟糕”,并且假设对齐等在编译器/平台上不是问题,这是未定义或损坏的行为吗?如果我有这样的结构:-structdata{inta,b,c;};structdatathing;a、b、c作为(&thing.a)访问是否合法[0]、(&thing.a)[1]和(&thing.a)[2]?在每种情况下,在我尝试过的每个编译器和平台上,我尝试过的每个设置都“有效”。我只是担心编译器可能没有意识到b和thing[1]是同一个东西,并且存储到'b'可能会放在一个寄存器中[1]从内存中读取错误的值(例如)。在每种情况下,我都尝试过它做了正确的事情。(我当然意识到这并不能证明什么)这不是我
我惊讶地发现以下工作:#includeintmain(intargc,char**argv){structFoo{Foo(Foo&bar){std::cout我将构造对象的地址传递给它自己的构造函数。这看起来像是源代码级别的循环定义。标准是否真的允许您在构建对象之前将对象传递给函数,或者这是未定义的行为?我想这并不奇怪,因为所有类成员函数都已经有一个指向它们的类实例的数据的指针作为隐式参数。并且数据成员的布局在编译时是固定的。注意,我不是在问这是有用还是好主意;我只是在修补以了解有关类(class)的更多信息。 最佳答案 这不是未定
据我了解,写时复制不是在C++11中实现符合标准的std::string的可行方法,但当它最近在讨论中出现时,我发现我自己无法直接支持这种说法。C++11不承认基于COW的std::string实现我是否正确?如果是这样,这个限制是否在新标准的某处明确说明(在哪里)?或者这个限制是否隐含,因为它是对std::string的新要求的综合影响,它排除了基于COW的std::string。在这种情况下,我会对“C++11有效禁止基于COW的std::string实现”的章节风格派生感兴趣。 最佳答案 这是不允许的,因为根据标准21.4.1