草庐IT

合法性

全部标签

c++ - 在使用声明引入的折叠表达式中使用运算符是否合法?

我在尝试在折叠表达式中使用任意函数时,发现以下代码可以用gcc编译但不能用clang编译。enumEnum{A=3,B=8,C=5};namespaceEnumMax{constexprEnumoperator>>=(constEnumleft,constEnumright){returnleftconstexprEnummax(){usingEnumMax::operator>>=;return(enums>>=...);}constexprEnummax_v=max();https://godbolt.org/z/-LOudM似乎clang没有考虑重载运算符,而是尝试在折叠表达式中

c++ - 声明 constexpr initializer_list 对象是否合法?

作为thisSOquestion讨论期间提出的一个问题:这是否合法,也许是N3471,声明一个constexprstd::initializer_list对象?示例:constexprstd::initializer_listmy_list{};为什么我认为它可能不合法:initializer_list必须是文字类型;但是有没有保证它是文字类型?来自N3485的引文。[dcl.constexpr]/9:Aconstexprspecifierusedinanobjectdeclarationdeclarestheobjectasconst.Suchanobjectshallhavelit

c++ - sizeof(int()) 是合法的表达式吗?

这个问题的灵感来自Issizeof(void())alegalexpression?但有一个重要的区别,如下所述。有问题的表达式是:sizeof(int())在C++语法中出现:unary-expression:sizeofunary-expressionsizeof(type-id)然而,(int())可以用不同的含义匹配这两种情况:作为一个一元表达式,它是一个值初始化的int纯右值,用多余的括号括起来作为一个type-id,它是一个没有参数返回int的函数的类型。在sizeof的语义约束中,即C++14[expr.sizeof]/1,它解释了sizeof(type-id的形式)可能

c++ - 在嵌套的 'try' 中重新抛出异常是否合法?

以下是否在C++中定义明确?我被迫将异常“转换”为返回代码(许多C用户使用相关API,因此我需要确保在将控制权返回给调用者之前捕获并处理所有C++异常)。enumErrorCode{…};ErrorCodedispatcher(){try{throw;}catch(std::bad_alloc&){returnErrorCode_OutOfMemory;}catch(std::logic_error&){returnErrorCode_LogicError;}catch(myownstdexcderivedclass&){returnErrorCode_42;}catch(...){r

c++ - 在对象被显式销毁但在其内存被释放之前调用成员函数是否合法?

我有这个代码:structdata{voiddoNothing(){}};intmain(){data*ptr=newdata();ptr->~data();ptr->doNothing();::operatordelete(ptr);}请注意,doNothing()是在对象被销毁之后但在其内存被释放之前被调用的。看起来“对象生命周期”已经结束,但是指针仍然指向正确分配的内存。成员函数不访问任何成员变量。在这种情况下,成员函数调用是否合法? 最佳答案 是的,对于OP中的代码。因为析构函数是微不足道的,调用它并不会结束对象的生命周期。

python - 在 Python 中是否有任何合法使用 list[True]、list[False] 的方法?

由于True和False是int的实例,以下在Python中有效:>>>l=[0,1,2]>>>l[False]0>>>l[True]1我明白为什么会这样。但是,我发现这种行为有点出乎意料,并且可能导致难以调试的错误。它肯定咬了我好几次。谁能想到用True或False合法使用索引列表? 最佳答案 过去,有人利用这种行为制作了穷人的conditionalexpression:['foo','bar'][eggs>5]#produces'bar'wheneggsis6orhigher,'foo'otherwise但是,使用properc

java - 'T.super' 是 JLS 的合法表达吗?

考虑以下一组表达式:classT{{/*1*/Objecto=T.super;//error:'.'expected/*2*/o.toString();}}尝试编译它会在/*1*/行失败并出现错误:error:'.'expectedo=T.super;^同时使用OpenJDK1.8.0(Ubuntu)或OracleJDK1.8(Windows)。但是,Eclipse4.5.0(Mars)编译没有任何错误,结果是:classT{T();0aload_0[this]1invokespecialjava.lang.Object()[8]//super()4aload_0[this]5asto

java - 为什么在某些情况下重新抛出 Throwable 而不声明它是合法的?

我希望以下代码在throwt;上引发编译时错误,因为main未声明为抛出Throwable,但它编译成功(在Java1.7.0_45中),并且如果编译时错误得到修复,它会产生您期望的输出。publicclassTest{publicstaticvoidmain(String[]args){try{thrownewNullPointerException();}catch(Throwablet){System.out.println("Caught"+t);throwt;}}}如果Throwable更改为Exception也会编译。这并没有像预期的那样编译:publicclassTest

java - 为什么同名静态方法的静态导入是合法的?

假设我们有这些包和类:packagep1;publicclassA1{publicstaticvoida(){}}packagep2;publicclassA1{publicstaticvoida(){}}packagep3;importstaticp1.A1.a;importstaticp2.A1.a;publicclassA1{publicstaticvoidtest(){}}我想知道,为什么p3包中方法的静态导入是合法的(不会导致编译时错误)?我们将无法在test()方法中进一步使用它们,因为这样使用会导致编译时错误。为什么它与普通的类导入不同。假设我们想将p1和p2包中的类A1

java - 1/0 是合法的 Java 表达式吗?

以下在我的Eclipse中编译得很好:finalintj=1/0;//compilesfine!!!//throwsArithmeticException:/byzeroatrun-timeJava从一开始就阻止了许多“愚蠢的代码”(例如"Five"instanceofNumber无法编译!),所以事实上这甚至没有生成一个警告让我非常惊讶。当您考虑允许在编译时优化常量表达式这一事实时,这种阴谋就会加深:publicclassDiv0{publicstaticvoidmain(String[]args){finalinti=2+3;finalintj=1/0;finalintk=9/2;