草庐IT

c++ - <=> 在 c++20 之前的代码中的合法出现

在wandbox中搞乱我发现当clang看到时实际上会发出警告。出现在C++17或更早版本中。warning:''isasingletokeninC++2a;addaspacetoavoidachangeinbehavior[-Wc++2a-compat]我试图弄清楚如何编写字符序列的合法用例在C++17中,但我想出allfeelverycontrived.最可能的示例(imo)涉及使用模板:structA{booloperatorvoidf(){}intmain(){f();}liveexample其他所有内容仍然涉及通过名称明确提及比较函数operator.有没有比较常见的样子我无

c++ - 内联 constexpr 函数定义是否合法? gcc (ok) vs clang (error)

我当前的程序被clang拒绝,但用gcc编译得很好。它归结为以下简化示例:structA{staticconstexprinlineintone();};inlineconstexprintA::one(){return1;}intmain(){return0;}g++4.7.2编译它没有错误(g++-std=c++11-Wall-g-omainexample.cpp)。clang++3.1拒绝它:$clang++-std=c++11-Wall-g-omainexample.cppexample.cpp:6:25:error:conflictingtypesfor'one'inline

c++ - 为什么空表达式在 C/C++ 中是合法的?

intmain(){intvar=0;;//Typowhichcompilesjustfine} 最佳答案 当NDEBUG被定义时,assert(foo==bar);怎么可能编译成空? 关于c++-为什么空表达式在C/C++中是合法的?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/824512/

c++ - 将 main 声明为 extern "C"是否合法 C++?

作为一名低级程序员,我经常使用可执行文件的模块启动代码,因此我非常了解“crt0”之类的代码是如何工作的。在编写C++代码时,我通常将main声明为extern"C"以匹配C启动代码将要调用main。因此,我通常将此声明用于main(如果专门针对Windows,则使用wmain):extern"C"intmain(intargv,constchar*const*argv)extern"C"int__cdeclwmain(intargv,constwchar_t*const*argv)在main上使用extern"C"是否合法?另外,对于argv的类型,constchar*const*是

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