language-lawyer相关内容

非命名空间范围内的显式特化不会在 GCC 中编译

以下代码在 Clang 中编译,但在 GCC 中不编译: template结构小部件{模板空 foo(U){}模板无效的 foo(int*){}}; 根据 C++ 标准([temp.expl.spec],第 2 段): 可以在任何范围内声明显式特化,其中相应的主模板可以定义 这是 GCC 中的错误吗?如果是,我如何在其错误跟踪器中找到它? 这是 GCC 的输出: pro ..
发布时间:2021-12-13 18:56:29 C/C++开发

static_assert 依赖于非类型模板参数(gcc 和 clang 上的不同行为)

template 结构搭便车{static_assert(sizeof(answer) != sizeof(answer), "无效答案");};模板 struct Hitchhiker{}; 在尝试使用 static_assert 禁用通用模板实例化时,我发现 clang 中的上述代码即使没有实例化模板也会生成断言错误,而 gcc 仅在使用 42 以外的参数实例化 Hitchhik ..
发布时间:2021-12-13 18:28:32 C/C++开发

“即时上下文"究竟是什么?SFINAE 适用的 C++11 标准中提到的?

C++11 标准的第 14.8.2/8 段指定了在何种条件下替换失败会或不会导致“硬"编译错误(从而导致编译失败)或“软"错误这只会导致编译器从一组候选重载解析中丢弃模板(不会使编译失败并启用众所周知的 SFINAE 成语): 如果替换导致无效的类型或表达式,则类型推导失败.无效的类型或表达式如果使用替换参数编写,则将是格式错误的.[注意:访问检查是这样完成的替代过程的一部分.—end no ..
发布时间:2021-12-13 18:23:12 C/C++开发

在应用间接引用时,标准是否要求指针变量的左值到右值转换?

TL;DR 给定以下代码: int* ptr;*ptr = 0; 在应用间接引用之前,*ptr 是否需要 lvalue-to-rvalue 的 ptr 转换? 该标准在很多地方涵盖了 lvalue-to-rvalue 的主题,但似乎没有指定足够的信息来确定 * 运算符 是否需要这种转换. 详情 左值到右值的转换见N3485 在 4.1 Lvalue-to-rvalue ..

通过易失性引用/指针访问声明的非易失性对象是否赋予所述访问易失性规则?

这将是一篇很长的文章,为了将其语境化并提供尽可能多的信息,我必须浏览各种链接和引号 - 这通常是我们进入 C/C++ 标准兔子洞的唯一方法.如果您对这篇文章有更好的引用或任何其他改进,请告诉我.但先总结一下,你可以责怪@zwol 我发这个;-) 目的是从两个命题中找出真相: C 和(通过导入;见注释)C++ 标准要求通过 volatile * 或 volatile & 访问必须引用最初声明的 ..
发布时间:2021-12-13 13:25:42 C/C++开发

无关指针的相等比较可以评估为真吗?

C 标准的第 6.5.9 节 关于 == 和 != 运算符声明如下: 2 应满足以下条件之一: 两个操作数都有算术类型; 两个操作数都是指向兼容类型的合格或不合格版本的指针; 一个操作数是一个指向对象类型的指针,另一个是一个指向void的限定或非限定版本的指针;或 一个操作数是指针,另一个是空指针常量. ... 6 两个指针比较相等当且仅当都是空指针,两者都是指向同一 ..
发布时间:2021-12-13 13:20:32 其他开发

指针变量只是带有某些运算符的整数还是“符号"?

编辑:原始单词选择令人困惑.“象征"一词比原来的(“神秘")好得多. 在关于我之前的 C++ 问题的讨论中,我被告知指针是 "一个很像的简单值类型一个整数" 不是“神秘的" "位模式(对象表示) 包含普通可复制类型的值(值表示)(第 3.9/4 节),这是一个指针." 这听起来不对!如果没有什么是象征性的并且指针是它的表示,那么我可以执行以下操作.我可以吗? #includ ..
发布时间:2021-12-13 13:18:16 C/C++开发

自 C++17 以来,具有正确地址和类型的指针是否仍然始终是有效指针?

(参考 这个问题和答案.) 在C++17标准之前,中包含了下面这句话[basic.compound]/3: 如果类型 T 的对象位于地址 A,则称其值为地址 A 的类型为 cv T* 的指针指向该对象,无论该值是如何获得的. 但从 C++17 开始,这句话已经删除. 例如我相信这句话定义了这个示例代码,并且因为 C++17 这是未定义的行为: alignas(int) ..
发布时间:2021-12-13 13:03:40 C/C++开发

我们可以有多少级指针?

单个变量中允许有多少个指针(*)? 让我们考虑以下示例. int a = 10;int *p = &a; 同样我们可以有 int **q = &p;int ***r = &q; 等等. 例如 int ****************zz; 解决方案 C标准规定了下限: 5.2.4.1 翻译限制 276 实现应能够翻译和执行至少一个程序,该程序包含以下每一项限制 ..
发布时间:2021-12-13 13:00:51 C/C++开发

对多维数组的一维访问:它是定义明确的行为吗?

我想我们都同意通过以一维方式取消引用(可能偏移)指向其第一个元素的指针来访问真正的多维数组被认为是惯用的 C 语言,例如: void clearBottomRightElement(int *array, int M, int N){数组[M*N-1] = 0;//假设数组是一维的}int mtx[5][3];...clearBottomRightElement(&mtx[0][0], 5, 3 ..

当返回对象的函数在没有 return 语句的情况下结束时会发生什么

在 C++ 中,当一个应该返回对象的函数在没有 return 语句的情况下结束时会发生什么?返回什么? 例如 std::string func() {} 解决方案 返回什么? 我们不知道.根据标准,行为是未定义的. §6.6.3/2 返回语句[stmt.return]: (强调我的) 从构造函数、析构函数或具有 cv void 返回类型的函数的末尾流出等价于 ..
发布时间:2021-12-11 19:54:35 C/C++开发

变量自身迭代 - 不同类型的不同行为

请查看帖子末尾的最新更新. 特别是,请参阅更新 4:变体比较诅咒 我已经看到伙伴们用头撞墙以了解变体的工作原理,但从未想过我会遇到自己的糟糕时刻. 我已经成功地使用了以下 VBA 结构: 对于 i = 1 到 i 当 i 是 Integer 或任何数字类型时,这非常有效,从 1 迭代到 i原始值/代码>.我会在 i 是 ByVal 参数的情况下这样做 - 你可能会说懒 ..
发布时间:2021-12-11 12:58:40 其他开发

替代 for 循环语法

以下是 C 标准的片段(的第 6.8.5 节)n1256 TC3 C99). 迭代语句: while ( 表达式 ) 语句 do 语句 while ( 表达式 ) ; for ( expressionopt ; expressionopt ; expressionopt ) 语句 for ( 声明 表达式opt ; 表达式opt ) 语句 引起我兴趣的是 ..
发布时间:2021-12-11 12:31:21 其他开发

C++11 引入了标准化的内存模型.这是什么意思?它将如何影响 C++ 编程?

C++11 引入了标准化的内存模型,但这究竟是什么意思?它将如何影响 C++ 编程? 本文(作者:Gavin克拉克引用Herb Sutter) 说, 内存模型意味着C++代码现在有一个标准化的库可以调用不管是谁做的编译器以及它在什么平台上运行.有一个标准的方法来控制如何不同的线程与处理器的内存. "当你在谈论分裂时[代码] 跨不同内核在标准中,我们正在谈论内存模型.我们准备去优化 ..
发布时间:2021-12-06 11:15:56 C/C++开发

使用 printf 的 %s 说明符打印 NULL 的行为是什么?

遇到一个有趣的面试问题: 测试1:printf("测试%s\n", NULL);printf("测试%s\n", NULL);印刷:测试(空)测试(空)测试2:printf("%s\n", NULL);printf("%s\n", NULL);印刷分段错误(核心转储) 虽然这可能在某些系统上运行良好,但至少我的会引发分段错误.这种行为的最佳解释是什么?上面的代码是用 C 编写的. 以下是 ..
发布时间:2021-12-03 13:06:29 服务器开发

访问文字的属性适用于所有类型,但不适用于 `int`;为什么?

我已经读到 python 中的所有东西都是一个对象,因此我开始尝试不同的类型并在它们上调用 __str__ —一开始我真的很兴奋,但后来我很困惑. >>>“你好世界".__str__()'你好,世界'>>>[].__str__()'[]'>>>3.14.__str__()'3.14'>>>3..__str__()'3.0'>>>123.__str__()文件“",第 1 行123.__str__ ..
发布时间:2021-12-02 17:05:37 Python

是否有 C 的任何非二进制补码实现?

众所周知,ISOC 标准(以及 C++,我认为,虽然我对 C 方面更感兴趣)允许有符号数的三种底层表示: 补码; ones 的补码;和 符号/大小. 维基百科的条目指出,符号/幅度用于 60 年代的 IBM 7090,而 PDP-1、CDC 160A 和 UNIVAC 1100 使用的是符号/幅度,所有这些都可以追溯到 60 年代. 是否有任何其他具有这些替代表示的 C(或底 ..
发布时间:2021-12-02 08:23:29 其他开发

陷阱表示

什么是 C 中的“陷阱表示"(一些示例可能会有所帮助)?这适用于 C++ 吗? 鉴于此代码... float f=3.5;int *pi = (int*)&f; ... 并假设 sizeof(int) == sizeof(float),f 和 *pi 是否具有相同的二进制表示/模式? 解决方案 陷阱表示是 C99(IIRC 不是 C89)使用的一个包罗万象的术语,用于描述适合 ..
发布时间:2021-12-02 08:12:22 C/C++开发