language-lawyer相关内容
C++标准要求编译器在C++常量计算中检查未定义的行为。 在this talk中,Chandler Carruth指出,在检查UB时“您将耗尽检测错误的能力”,而且在一般情况下,检测UB与halting problem相关,因此可以证明无法确定。 他指的不是conexpr中的UB,但conexpr计算从C++14开始就像常规程序一样通用,因此这仍然适用。 那么,当编译器无法确定程
..
在C89标准中,我找到以下部分: 3.2.2.1 L值和功能指示符 除非它是sizeof运算符、一元&;运算符、++运算符、--运算符或的左操作数的操作数。运算符或赋值运算符,则不具有数组类型的左值将转换为存储在指定对象中的值(不再是左值)。如果左值具有限定类型,则该值具有左值类型的非限定版本;否则,该值具有左值类型。如果左值的类型不完整并且没有数组类型,则行为未定义。 如果我
..
我一直在试验一个用于可组合管道的系统,它涉及一组可能是模板化的“阶段”。每个阶段处理自己的设置、执行和清理,模板演绎用于构建流水线使用的“状态”的最小列表。这需要相当多的样板模板代码,这已经显示出一些明显不一致的行为。尽管实验成功,但由于无效的实例化,实际将其放入我们的代码库中会导致错误。 花了一些时间来找出玩具(工作的)解决方案和更丰富的版本之间的差异,但最终缩小到显式命名空间规范。
..
GCC和clang对于是否应该编译以下代码意见不一: template struct tuple {}; template struct Test; template typename... Outer, // XXX Types
..
我想了解的是,JavaScript中的赋值操作符是否应该用作(重新)绑定,而不是突变。换句话说,给定以下条件: let x = 10; x = 20; 我想了解第二行是否导致编码值10的位被修改,以便编码值20,或者-如果x标识符与其他(可能是新的)内存块反弹,该内存块被初始化为包含值20。 后一种选择是我找到的常见解释(例如,在中 ECMA-262-5详细说明)。这种解释的好处是,它
..
我这里有一些用GCC、clang和msvc编译的代码: #include #include struct c_class; template struct holder { friend auto adl_lookup(holder); }; template struct l
..
C++20标准规定函数调用,7.6.1.3/8: 参数的初始化(包括每个关联值计算和副作用)相对于任何其他参数的初始化是不确定的。 不确定排序(相对于非排序)可确保影响相同内存区域的副作用不是未定义的行为。Cp首选项gives the following examples: f(i = -2, i = -2); // undefined behavior until C++17
..
如果在C++中定义了一个新变量,则可以在初始化表达式中使用该变量的名称,例如: int x = sizeof(x); 函数参数的缺省值怎么办?是否允许在那里按名称引用参数?例如: void f(int y = sizeof(y)) {} 此函数在Clang中被接受,但在GCC中被拒绝,错误为: 'y' was not declared in this scope 演示
..
如果我在JavaScript控制台(在Chrome和Firefox中都进行了测试)中键入019 > 020,则会得到答案true。 这是因为020被解释为OctalIntegerLiteral(等于16),而019显然被解释为DecimalLiteral(并且等于19)。由于19大于16,019 > 020为true。 令我困惑的是,为什么019首先被解释为DecimalLiteral。是
..
在UML中,属性是关联端,可以由关联拥有,也可以由参与的分类器拥有,后者通常是一个类。当属性由类拥有时,它称为属性。例如,属性Book::author可以使用以下符号之一(其中应在右侧图表的作者关联端绘制一个点): 该属性可以用在如下约束表达式中:self.author或mybook.author->count() 对于二元关联来说,这很简单。但我怀疑这如何与三元(或更一般的N元)关联
..
在下面的代码中struct A有立即函数的默认构造函数,结构的对象通过new A{}的方式在动态内存中创建: struct A { consteval A() {} }; int main() { new A{}; } 只有Clang才接受它。 GCC抱怨 error: the value of '' is not usa
..
C17 6.2.6.2/4表示: 如果实现不支持负零,则&;、|、^、~、<;<;的行为, And>>运算符的操作数将生成这样的值,这是未定义的。 如果我有一个2的补码系统,它不支持负零。它总是利用二进制数的所有可能组合来表示值。因此,无论使用哪种位运算,都不可能生成负零。那么这篇文章的意思是什么呢? 我的看法是,这部分指的是具有1的补码或带符号幅度的系统,这些系统
..
在C标准中陈述(强调我的): 如果两个类型的类型相同,则它们具有兼容的类型。类型说明符的6.7.2、类型限定符的6.7.3和声明符的6.7.6中描述了确定两个类型是否兼容的其他规则。56) 56)两种类型不必完全相同即可兼容。 来源:C18,§6.2.7/1-兼容类型和复合类型 我从这些句子中得到的信息不多,也不是很有帮助。通常,引用的部分也不提供有关兼容的确切含义的更多信息。
..
这个问题可能有点争议。 我在块作用域中有以下代码: int *a = malloc(3 * sizeof(int)); if (!a) { ... error handling ... } a[0] = 0; a[1] = 1; a[2] = 2; 我认为这段代码调用ub是因为指针算法超出界限。 原因是a对象指针的有效类型永远不是 设置为int[3],但仅设置为int。因此,对索引处的对
..
调用普通析构函数会终止对象的生命周期吗? 我读了this和this,但没有找到好的解释。这些线程声明简单的析构函数调用没有任何效果,像struct A { int x; } a; a.~A(); a.~A();这样的代码是合法的。 但我在标准中找到了这个例子: struct C { }; void f() { C * pc = new C; using C2 = C;
..
#include struct A { ~A(); }; A::~A() { std::cout
..
违反严格别名规则会产生未定义的行为,例如,通过网络将结构发送到字符缓冲区,然后该字符指针被C样式/std::reinterpret_cast()强制转换为结构指针。 C++std::bit_cast() function看起来可以用来在(实现?)定义的方式,即不违反严格的别名规则。 示例: #include #include
..
#include #include #include #include struct InitialSuspend{ bool await_ready(){ return false; } bool await_suspend(std::experim
..
我在working draft of standard C++中发现了一个可能的矛盾。首先我介绍事实,最后是我的问题。 建立整数折算等级时,[conv.rank]/1.1表示 没有两个带符号的整数类型[...]应具有相同的整数 转换等级,即使它们具有相同的表示形式。 [basic.fundamental]/8表示: 类型wchar_t是具有实现定义的不同类型 带符号或无符号
..
我知道关于这个话题有几个问题,但请听我说完。 我知道我们可以在未评估的上下文中使用无捕获lambdas(如decltype),但是可以捕获的lambdas怎么办? 我在当前的C++标准中找不到任何可以表明这是C++20以后的问题的东西,但我绝不是语言律师。 我所看到的是,主要的编译器在their results方面有所不同。 这些概念有效吗? template
..