language-lawyer相关内容

在结构中引用未定义的类型如何合法?

作为回答另一个问题的一部分,我遇到了一段这样的代码,gcc 编译时毫无怨言. typedef struct {结构 xyz *z;} xyz;int main (void) {返回0;} 这是我一直用来构造指向自身的类型(例如,链表)的方法,但我一直认为您必须命名结构,以便您可以使用 self-参考.换句话说,您不能在结构中使用 xyz *z,因为此时 typedef 尚未完成. 但是这 ..
发布时间:2021-12-23 17:24:56 其他开发

类与结构的内存布局如何

我来自 C 编程,其中结构体中的数据首先使用 top 变量布局,然后是第二个、第三个等等.. 我现在正在用 C++ 编程,而我正在使用一个类.我基本上想要实现相同的目标,但我也想要 get/set 方法以及其他方法(我也想尝试以 C++ 风格来做,并且可以学习一些新的东西). 是否有保证,例如公共变量将首先在内存中然后是私有变量? 解决方案 是否有保证,例如公共变量将是第一 ..
发布时间:2021-12-23 17:19:12 C/C++开发

“包含上述类型之一的聚合或联合类型"发生了什么?严格的别名规则?

以前,在 basic.lval 中,有这个要点: 在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的元素或非静态数据成员), 在当前的草案中,它已经消失了. WG21 的网站上有一些背景信息:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1359r0.html#2051: ..
发布时间:2021-12-23 17:02:32 C/C++开发

是不是传播“语法"?还是价差“运营商"?

我听说 ... 被称为“扩展 语法"和“扩展 运算符",后者是更受欢迎.相关 MDN 文档 的 URL 表明它最初被称为传播运算符,但后来改为传播语法,MDN 的操作员列表 没有提到它. Google 似乎认为 operator 一词更受欢迎和被接受,例如 Microsoft 文档 和 ... 标点符号应用的总称,参见 Felix Kling 的很好的答案,详细说明了所有用途和名称.补充答案 ..

ES6 中块级函数的精确语义是什么?

我试图通过阅读原始规范来了解 ES6 中新的标准化块级函数.我的粗浅理解是: ES6 中允许使用块级函数声明. 他们升到街区的顶部. 在严格模式下,它们在包含块之外不可见. 然而,由于这些语义的一部分被指定为“可选"并且仅对 Web 浏览器是必需的(附件 B).所以我想填写下表: |在块外可见?|吊起?到什么程度?|“TDZ"?|------------------------- ..
发布时间:2021-12-23 11:25:24 前端开发

vector 的复制/移动分配后底层存储会发生什么变化?

对于 std::vector 的复制分配,当源的大小小于目标的容量时,是否允许重新分配存储和缩小容量?或者是否保证不会发生重新分配/收缩(即始终尊重之前的 Reserve())? 另一方面,如果源的大小大于目标的容量并且发生重新分配,是否需要重新分配尊重源的容量(例如,目标的新容量不应小于源的容量,或甚至要求它们相同)?或者重新分配只是完成它的工作(基于新的大小)而不考虑源的容量? 至 ..
发布时间:2021-12-21 13:54:35 C/C++开发

将 std::vector 附加到自身,未定义的行为?

这个问题让我不确定向自身附加一个向量.所以问题是:以下代码行符合我的预期,但是否符合标准? vec.reserve(vec.size() * 2):vec.insert(vec.end(), vec.begin(), vec.end()); 以下(没有reserve())仍然有效,是否符合标准? vec.insert(vec.end(), vec.begin(), vec.end()); ..
发布时间:2021-12-21 13:39:59 C/C++开发

标准对矢量调用 clear 如何改变容量有什么说法?

该网站暗示清除矢量可能会改变容量: http://en.cppreference.com/w/cpp/container/矢量/清除 很多实现不会在调用后释放分配的内存到clear(),有效地留下了vector的capacity()不变. 但根据@JamesKanze 的说法,这是错误的,清除的标准指令不会改变容量. 标准怎么说? 解决方案 取决于您正在查看的标准版 ..
发布时间:2021-12-21 13:22:50 C/C++开发

移动的向量总是空的吗?

我知道通常标准对已移出的值几乎没有要求: N3485 17.6.5.15 [lib.types.movedfrom]/1: C++ 标准库中定义的类型的对象可以从 (12.8) 中移出.移动操作可能显式指定或隐式生成.除非另有说明,否则此类移出的对象应处于有效但未指定的状态. 我找不到关于 vector 的任何内容,明确将其排除在本段之外.但是,我无法想出一个理智的实现来导致向量 ..
发布时间:2021-12-21 13:22:28 C/C++开发

遮蔽外部名称的 decltype 和类成员名称之间的交互

此代码 int 冲突;结构 Foo {声明类型(冲突)冲突;}; 在 clang 上静默编译,但在 gcc 上编译失败并出现错误 错误:'int Foo::clash'的声明[-fpermissive] 错误:将 'clash' 的含义从 'int crash' [-fpermissive] 更改为 似乎需要 2 个因素才能出现错误: 阴影必须由类成员完成(如果是函数的 ..
发布时间:2021-12-18 23:17:08 C/C++开发

为什么“A<0>=0"中的模板id由于大于或等于运算符“>="而不能在没有空间的情况下编译?

template 使用 A = int;void f(A<0=0);//试图声明一个函数 f 接受 int,//使用默认参数 0//按预期工作://void f(A = 0); 这既不能在 GCC 4.9.2 或 Clang 3.5 上编译 - 更不用说 ICC 或 VC++.显然 >= 位被解析为大于或等于运算符.但是,这对于 [temp.names]/3 来说似乎是不正确的: 名称查找 ..
发布时间:2021-12-13 19:18:50 C/C++开发

我可以将 C++17 无捕获 lambda constexpr 转换运算符的结果用作函数指针模板非类型参数吗?

在回答我该怎么做编写一个看起来像方法的 lambda 表达式?,我试图通过利用以下事实将无捕获的 lambda 转换为成员函数指针,因为自 C++17 起,无捕获的 lambda 具有 constexpr 将运算符转换为其函数指针类型. 所以我想出了一个问题: template结构 A{};int main(){A([]{})>{};//1co ..
发布时间:2021-12-13 19:17:15 C/C++开发

在 typedef 和 new 中使用 typename 关键字

考虑这个代码, template结构体示例{类型名称 T::X *x;//声明指向T的X的指针}; 在上面的代码中,关键字typename是编译器所必需的,以便它可以在模板中消除嵌套类型和嵌套值之间的歧义.这意味着,在没有 typename 关键字的情况下,编译器会将其解释为 T::X 与 x 的乘法, T::X *x;//将 T::X 与 x 相乘 因此在可能出现歧义的情况下,关键字ty ..
发布时间:2021-12-13 19:03:14 C/C++开发