草庐IT

合法性

全部标签

c++ - C/C++ 语法 - 使用 , 而不是 ; 分隔语句合法的?

我刚刚遇到了执行此操作的这段代码:deletea,a=0;它编译并运行得很好。但这不应该是:deletea;a=0;为什么在这种情况下允许使用,分隔语句?谢谢:) 最佳答案 在C和C++中,大多数“语句”实际上是表达式。添加到表达式的分号使其成为语句。或者,允许(但几乎总是坏的风格)用逗号运算符分隔有副作用的表达式:左边的表达式被评估它的副作用(并且它的值被丢弃),而右边的表达式-side表达式被评估其值。 关于c++-C/C++语法-使用,而不是;分隔语句合法的?,我们在StackOv

c++ - 从 C++14 开始,尾随返回类型语法的合法使用

实际上是否有任何理由再使用以下语法:templateautoaccess(T&t,inti)->decltype(t[i]){returnt[i];}现在我们可以使用:templatedecltype(auto)access(T&t,inti){returnt[i];}尾随返回类型语法现在看起来有点多余? 最佳答案 推导的返回类型对SFINAE不友好。如果t[i],此重载将简单地退出重载集无效:templateautoaccess(T&t,inti)->decltype(t[i]){returnt[i];}而这种重载不会导致硬错误:

collections - Kotlin:通过强制转换修改(不可变)列表,合法吗?

我们知道Kotlin中的List是不可变的,即你不能像下面这样添加和删除。classTempClass{varmyList:List?=nullfundoSomething(){myList=ArrayList()myList!!.add(10)myList!!.remove(10)}}但如果我们将其转换为如下所示的ArrayList,则添加和删除可以正常工作。classTempClass{varmyList:List?=nullfundoSomething(){myList=ArrayList()(myList!!asArrayList).add(10)(myList!!asArra

collections - Kotlin:通过强制转换修改(不可变)列表,合法吗?

我们知道Kotlin中的List是不可变的,即你不能像下面这样添加和删除。classTempClass{varmyList:List?=nullfundoSomething(){myList=ArrayList()myList!!.add(10)myList!!.remove(10)}}但如果我们将其转换为如下所示的ArrayList,则添加和删除可以正常工作。classTempClass{varmyList:List?=nullfundoSomething(){myList=ArrayList()(myList!!asArrayList).add(10)(myList!!asArra

c++ - 是一个声明 void();合法的,实际上是什么?

我有一小段代码,其中有一个语句void();intmain(){void();//1:parsesfineinGCC5.4.0-Wpedantic//void;//2:errordeclarationdoesnotdeclareanything}1void()到底是什么?匿名函数声明?类型声明?空表达式?什么使1void()与2void;不同?我已经读过:Issizeof(void())alegalexpression?但是void()被认为是sizeof中的一种类型Whatdoesthevoid()indecltype(void())meanexactly?它在declspec中被考

c++ - 优化 volatile 堆栈变量的存储/构造是否合法?

我注意到在某些情况下,clang和gcc优化了在堆栈上声明的volatilestruct的构造或赋值。例如下面的代码:structnonvol2{uint32_ta,b;};voidvolatile_struct2(){volatilenonvol2temp={1,2};}Compiles在clang上:volatile_struct2():#@volatile_struct2()ret另一方面,gcc不会删除存储,尽管它确实将两个隐含存储优化为一个存储:volatile_struct2():movabsrax,8589934593movQWORDPTR[rsp-8],raxret奇怪

c++ - 我可以在布局兼容的标准布局类型之间合法地重新解释_cast 吗?

我正在写一个类,假设答案是Areenumerationtypeslayoutcompatiblewiththeirunderlyingtype?是"is",是布局兼容的structkevent但使用enumclasses用于filter、flags等.为相关领域提供适当的基础类型。它也是标准布局(字段都是private并且它们本身都是标准布局,没有virtual成员,没有基类)。根据我对n3690的阅读,我可以确定我的类和structkevent具有相同的值表示,但我在标准中看不到任何允许我这样做的内容reinterpret_cast在它们之间,尽管这似乎是对“值表示”的合理解释。这在

c++ - 修改 Duff 设备的语法 - 这是合法的 C/C++ 吗?

直到昨晚我才遇到好奇Duff'sdevice首次。我一直在阅读它,我认为理解它并不难。我很好奇的是奇怪的语法(来自维基百科):registershort*to,*from;registerintcount;{registerintn=(count+7)/8;switch(count%8){case0:do{*to=*from++;case7:*to=*from++;case6:*to=*from++;case5:*to=*from++;case4:*to=*from++;case3:*to=*from++;case2:*to=*from++;case1:*to=*from++;}whi

c++ - 将可变类型列表的扩展打包到复杂类型的初始化列表中——这合法吗?

我想将可变类型列表“具体化”到相关值的initializer_list中。例如,有一个std::tuple几个std::integral_constant得到一个std::initializer_list{...}.在一般情况下,我想获得一些复杂类型的initializer_list,比如std::string.但是下面这个简单的例子让我在用Clang编译时崩溃了(尽管它适用于GCC,至少在Coliru上是这样),所以我怀疑是UB(或Clang中的错误):templatestd::initializer_listmaterialize(){return{std::to_string(T

c++ - Valgrind 合法的 "possibly lost"字节示例

我看到valgrind将内存泄漏分为:绝对迷路了间接丢失可能丢失了仍然可以联系到压制我刚刚修复了一个漏洞,其中“可能丢失”是主要问题。documentationsays:"possiblylost意味着你的程序正在泄漏内存,除非你用指针做一些不寻常的事情,这些指针可能会导致它们指向已分配block的中间;请参阅用户手册了解一些可能的原因"我可以知道一个“用指针做不寻常的事情,可能导致它们指向已分配block的中间”的例子吗?我的意思是一个例子,尽管它是由valgrind报告的,但可以忽略“可能丢失”。一个使用指针使valgrind提示但同时以这种方式使用指针在某种程度上是合法的示例谢谢