language-lawyer相关内容
作为回答另一个问题的一部分,我遇到了一段这样的代码,gcc 编译时毫无怨言. typedef struct {结构 xyz *z;} xyz;int main (void) {返回0;} 这是我一直用来构造指向自身的类型(例如,链表)的方法,但我一直认为您必须命名结构,以便您可以使用 self-参考.换句话说,您不能在结构中使用 xyz *z,因为此时 typedef 尚未完成. 但是这
..
我来自 C 编程,其中结构体中的数据首先使用 top 变量布局,然后是第二个、第三个等等.. 我现在正在用 C++ 编程,而我正在使用一个类.我基本上想要实现相同的目标,但我也想要 get/set 方法以及其他方法(我也想尝试以 C++ 风格来做,并且可以学习一些新的东西). 是否有保证,例如公共变量将首先在内存中然后是私有变量? 解决方案 是否有保证,例如公共变量将是第一
..
以前,在 basic.lval 中,有这个要点: 在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的元素或非静态数据成员), 在当前的草案中,它已经消失了. WG21 的网站上有一些背景信息:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1359r0.html#2051:
..
我听说 ... 被称为“扩展 语法"和“扩展 运算符",后者是更受欢迎.相关 MDN 文档 的 URL 表明它最初被称为传播运算符,但后来改为传播语法,MDN 的操作员列表 没有提到它. Google 似乎认为 operator 一词更受欢迎和被接受,例如 Microsoft 文档 和 ... 标点符号应用的总称,参见 Felix Kling 的很好的答案,详细说明了所有用途和名称.补充答案
..
我试图通过阅读原始规范来了解 ES6 中新的标准化块级函数.我的粗浅理解是: ES6 中允许使用块级函数声明. 他们升到街区的顶部. 在严格模式下,它们在包含块之外不可见. 然而,由于这些语义的一部分被指定为“可选"并且仅对 Web 浏览器是必需的(附件 B).所以我想填写下表: |在块外可见?|吊起?到什么程度?|“TDZ"?|-------------------------
..
对于 std::vector 的复制分配,当源的大小小于目标的容量时,是否允许重新分配存储和缩小容量?或者是否保证不会发生重新分配/收缩(即始终尊重之前的 Reserve())? 另一方面,如果源的大小大于目标的容量并且发生重新分配,是否需要重新分配尊重源的容量(例如,目标的新容量不应小于源的容量,或甚至要求它们相同)?或者重新分配只是完成它的工作(基于新的大小)而不考虑源的容量? 至
..
这个问题让我不确定向自身附加一个向量.所以问题是:以下代码行符合我的预期,但是否符合标准? vec.reserve(vec.size() * 2):vec.insert(vec.end(), vec.begin(), vec.end()); 以下(没有reserve())仍然有效,是否符合标准? vec.insert(vec.end(), vec.begin(), vec.end());
..
vectorv;v.push_back(1);v.push_back(v[0]); 如果第二次 push_back 导致重新分配,则向量中第一个整数的引用将不再有效.所以这不安全? vectorv;v.push_back(1);v.reserve(v.size() + 1);v.push_back(v[0]); 这样就安全了吗? 解决方案 看起来像 http://www.open-s
..
该网站暗示清除矢量可能会改变容量: http://en.cppreference.com/w/cpp/container/矢量/清除 很多实现不会在调用后释放分配的内存到clear(),有效地留下了vector的capacity()不变. 但根据@JamesKanze 的说法,这是错误的,清除的标准指令不会改变容量. 标准怎么说? 解决方案 取决于您正在查看的标准版
..
我知道通常标准对已移出的值几乎没有要求: N3485 17.6.5.15 [lib.types.movedfrom]/1: C++ 标准库中定义的类型的对象可以从 (12.8) 中移出.移动操作可能显式指定或隐式生成.除非另有说明,否则此类移出的对象应处于有效但未指定的状态. 我找不到关于 vector 的任何内容,明确将其排除在本段之外.但是,我无法想出一个理智的实现来导致向量
..
考虑到整个 C++11 标准,任何符合要求的实现是否有可能成功执行下面的第一个断言但失败后一个断言? #include int main(int, char**){const int I = 5, J = 4, K = 3;const int N = I * J * K;int arr1d[N] = {0};int (&arr3d)[I][J][K] = reinterpret_cast(arr
..
此代码 int 冲突;结构 Foo {声明类型(冲突)冲突;}; 在 clang 上静默编译,但在 gcc 上编译失败并出现错误 错误:'int Foo::clash'的声明[-fpermissive] 错误:将 'clash' 的含义从 'int crash' [-fpermissive] 更改为 似乎需要 2 个因素才能出现错误: 阴影必须由类成员完成(如果是函数的
..
gcc 在没有警告的情况下编译以下代码: #include 结构 foo {静态 constexpr double a = std::cos(3.);static constexpr double c = std::exp(3.);静态 constexpr double d = std::log(3.);静态 constexpr double e1 = std::asin(1.);静态 cons
..
考虑以下程序: public class GenericTypeInference {公共静态无效主(字符串 [] args){打印(新 SillyGenericWrapper().get());}私有静态无效打印(对象对象){System.out.println("对象");}私有静态无效打印(字符串字符串){System.out.println("字符串");}公共静态类 SillyGene
..
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 来说似乎是不正确的: 名称查找
..
我知道这就像打开潘多拉盒子,但它并没有停止打扰我.考虑一个简单的例子: #include 模板 结构 Foo: std::false_type { };模板 struct Foo:std::true_type { };int main() {static_assert(Foo::value);} 我知道 lambdas 不能在未评估的上下文中声明,但显然这里不是这种情况.还有什
..
在回答我该怎么做编写一个看起来像方法的 lambda 表达式?,我试图通过利用以下事实将无捕获的 lambda 转换为成员函数指针,因为自 C++17 起,无捕获的 lambda 具有 constexpr 将运算符转换为其函数指针类型. 所以我想出了一个问题: template结构 A{};int main(){A([]{})>{};//1co
..
考虑这个代码, template结构体示例{类型名称 T::X *x;//声明指向T的X的指针}; 在上面的代码中,关键字typename是编译器所必需的,以便它可以在模板中消除嵌套类型和嵌套值之间的歧义.这意味着,在没有 typename 关键字的情况下,编译器会将其解释为 T::X 与 x 的乘法, T::X *x;//将 T::X 与 x 相乘 因此在可能出现歧义的情况下,关键字ty
..
在下面的例子中,A 有一个成员 typedef Instantiate,它导致 B 的实例化. template结构体B{typedef typename T::Before Before;//行typedef typename T::After After;//错误:'A' 中没有名为 'After' 的类型};模板结构A{typedef int 之前;typedef typename B
..
Gcc 和 clang 似乎不同意这段代码是否应该编译: #include 模板 结构我的委托{};模板结构体签名特征;模板类委托,类型名称签名>struct signature_traits>{使用类型 = 签名;};static_assert(std::is_same_v>::type>);
..