language-lawyer相关内容

编译器如何知道C++常量计算不会触发未定义的行为?

C++标准要求编译器在C++常量计算中检查未定义的行为。 在this talk中,Chandler Carruth指出,在检查UB时“您将耗尽检测错误的能力”,而且在一般情况下,检测UB与halting problem相关,因此可以证明无法确定。 他指的不是conexpr中的UB,但conexpr计算从C++14开始就像常规程序一样通用,因此这仍然适用。 那么,当编译器无法确定程 ..
发布时间:2022-09-20 20:42:35 C/C++开发

在C语言中,是否有可能在语义上创建一个类型不完整的左值?

在C89标准中,我找到以下部分: 3.2.2.1 L值和功能指示符 除非它是sizeof运算符、一元&;运算符、++运算符、--运算符或的左操作数的操作数。运算符或赋值运算符,则不具有数组类型的左值将转换为存储在指定对象中的值(不再是左值)。如果左值具有限定类型,则该值具有左值类型的非限定版本;否则,该值具有左值类型。如果左值的类型不完整并且没有数组类型,则行为未定义。 如果我 ..

使用显式命名空间限定符时,模板实例化行为会发生变化吗?

我一直在试验一个用于可组合管道的系统,它涉及一组可能是模板化的“阶段”。每个阶段处理自己的设置、执行和清理,模板演绎用于构建流水线使用的“状态”的最小列表。这需要相当多的样板模板代码,这已经显示出一些明显不一致的行为。尽管实验成功,但由于无效的实例化,实际将其放入我们的代码库中会导致错误。 花了一些时间来找出玩具(工作的)解决方案和更丰富的版本之间的差异,但最终缩小到显式命名空间规范。 ..

JS中的赋值操作符是绑定还是突变?

我想了解的是,JavaScript中的赋值操作符是否应该用作(重新)绑定,而不是突变。换句话说,给定以下条件: let x = 10; x = 20; 我想了解第二行是否导致编码值10的位被修改,以便编码值20,或者-如果x标识符与其他(可能是新的)内存块反弹,该内存块被初始化为包含值20。 后一种选择是我找到的常见解释(例如,在中 ECMA-262-5详细说明)。这种解释的好处是,它 ..

函数参数求值和副作用

C++20标准规定函数调用,7.6.1.3/8: 参数的初始化(包括每个关联值计算和副作用)相对于任何其他参数的初始化是不确定的。 不确定排序(相对于非排序)可确保影响相同内存区域的副作用不是未定义的行为。Cp首选项gives the following examples: f(i = -2, i = -2); // undefined behavior until C++17 ..

函数的默认参数值取决于C++中的参数名称

如果在C++中定义了一个新变量,则可以在初始化表达式中使用该变量的名称,例如: int x = sizeof(x); 函数参数的缺省值怎么办?是否允许在那里按名称引用参数?例如: void f(int y = sizeof(y)) {} 此函数在Clang中被接受,但在GCC中被拒绝,错误为: 'y' was not declared in this scope 演示 ..

为什么019不是一个JavaScript语法错误?或者为什么是019&>020

如果我在JavaScript控制台(在Chrome和Firefox中都进行了测试)中键入019 > 020,则会得到答案true。 这是因为020被解释为OctalIntegerLiteral(等于16),而019显然被解释为DecimalLiteral(并且等于19)。由于19大于16,019 > 020为true。 令我困惑的是,为什么019首先被解释为DecimalLiteral。是 ..
发布时间:2022-07-20 11:51:16 前端开发

与三元关联相关的属性

在UML中,属性是关联端,可以由关联拥有,也可以由参与的分类器拥有,后者通常是一个类。当属性由类拥有时,它称为属性。例如,属性Book::author可以使用以下符号之一(其中应在右侧图表的作者关联端绘制一个点): 该属性可以用在如下约束表达式中:self.author或mybook.author->count() 对于二元关联来说,这很简单。但我怀疑这如何与三元(或更一般的N元)关联 ..

在一个不支持负零的系统中产生负零有什么意义?

C17 6.2.6.2/4表示: 如果实现不支持负零,则&;、|、^、~、<;<;的行为, And>>运算符的操作数将生成这样的值,这是未定义的。 如果我有一个2的补码系统,它不支持负零。它总是利用二进制数的所有可能组合来表示值。因此,无论使用哪种位运算,都不可能生成负零。那么这篇文章的意思是什么呢? 我的看法是,这部分指的是具有1的补码或带符号幅度的系统,这些系统 ..

如果两个类型在C中彼此兼容,这到底是什么意思?

在C标准中陈述(强调我的): 如果两个类型的类型相同,则它们具有兼容的类型。类型说明符的6.7.2、类型限定符的6.7.3和声明符的6.7.6中描述了确定两个类型是否兼容的其他规则。56) 56)两种类型不必完全相同即可兼容。 来源:C18,§6.2.7/1-兼容类型和复合类型 我从这些句子中得到的信息不多,也不是很有帮助。通常,引用的部分也不提供有关兼容的确切含义的更多信息。 ..
发布时间:2022-06-06 11:24:53 其他开发

动态数组的惯用初始化是否会调用未定义的行为?

这个问题可能有点争议。 我在块作用域中有以下代码: int *a = malloc(3 * sizeof(int)); if (!a) { ... error handling ... } a[0] = 0; a[1] = 1; a[2] = 2; 我认为这段代码调用ub是因为指针算法超出界限。 原因是a对象指针的有效类型永远不是 设置为int[3],但仅设置为int。因此,对索引处的对 ..

可能C++工作草案的措辞有缺陷(整数转换排名规则)

我在working draft of standard C++中发现了一个可能的矛盾。首先我介绍事实,最后是我的问题。 建立整数折算等级时,[conv.rank]/1.1表示 没有两个带符号的整数类型[...]应具有相同的整数 转换等级,即使它们具有相同的表示形式。 [basic.fundamental]/8表示: 类型wchar_t是具有实现定义的不同类型 带符号或无符号 ..
发布时间:2022-05-17 09:32:00 C/C++开发

未计算上下文中的lambdas(需要表达式)

我知道关于这个话题有几个问题,但请听我说完。 我知道我们可以在未评估的上下文中使用无捕获lambdas(如decltype),但是可以捕获的lambdas怎么办? 我在当前的C++标准中找不到任何可以表明这是C++20以后的问题的东西,但我绝不是语言律师。 我所看到的是,主要的编译器在their results方面有所不同。 这些概念有效吗? template ..
发布时间:2022-05-17 09:26:15 C/C++开发