问题标签 [language-lawyer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
759 浏览

c++ - 为什么不强制 operator new 将参数作为“const size_t”?

没有在任何地方使用下面的东西,但这个问题仍然在我脑海中很久。

知道上面对于重载可能不是一个明确定义的行为new(比如如果size减少了),为什么标准不强制编译器将其设为void* operator new (const size_t);

同样可以争论operator delete,它应该在哪里void operator delete (void* const);(添加const以避免指针被改变)。

0 投票
6 回答
7757 浏览

c++ - using namespace std 的排序;包括?

我最近在一个 C++ 项目的源文件中看到了这段代码:

忽略所有是否是一个好主意的问题,using namespace std上面的代码是否合法?这两行之前的文件中没有代码。

我原以为这不会编译,因为namespace std在指令将其包含到文件中之前尚未在范围内声明#include <iostream>,但是使用项目的构建系统编译就好了。如果有人有指向规范相关部分的链接,那将不胜感激。

0 投票
4 回答
3487 浏览

c++ - 纯虚析构函数的目的是什么?

可能的重复:
在什么情况下给出一个纯虚函数的实现是有利的?
为什么我们需要 C++ 中的纯虚析构函数?

当编译器具有纯析构函数时,编译器不会强制Child class实现析构函数。Basevirtual

有趣的是;编译器宁愿强制Base定义一个析构函数体。这是明白的。(演示供参考)

那么在课堂上使用析构函数的目的是什么?(仅仅是为了禁止创建对象吗?)virtualBaseBase

0 投票
5 回答
28525 浏览

c++ - 我们真的需要 C++11 中的“枚举类”吗?

当我们有,

那我们为什么需要,

IMO 第二版不提供比第一版更多的功能。我不认为这enum class只是为了节省 2 个花括号{};!我错过了任何重要的方面吗?

enum class作为一个小问题,除了语法之外还有什么区别enum struct(因为两者都有public访问说明符)?

0 投票
3 回答
777 浏览

c - 鉴于 p 是指向不完整类型的指针,&*p 是有效的 C 吗?

以下示例是 C 中有效的完整翻译单元吗?

struct foo是一个不完整的类型,但我在 C 标准中找不到明确禁止取消引用不完整类型。特别是,§6.5.3.2 说:

一元运算&符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。如果操作数是一元运算符的结果,则该运算*符和该&运算符都不会被计算并且结果就像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值。

结果不是左值的事实并不密切 - 返回值不必如此。对*运算符的约束很简单:

一元 * 运算符的操作数应具有指针类型。

&运算符是:

一元运算&符的操作数应该是一个函数指示符、一个[]或一元运算符的结果*,或者是一个左值,它指定一个不是位字段且未使用register存储类说明符声明的对象。

这里两者都满足,所以结果应该等价于 just return j;

但是,gcc 4.4.5 不编译此代码。相反,它给出了以下错误:

这是 gcc 的缺陷吗?

0 投票
1 回答
620 浏览

actionscript-3 - Actionscript 3 中的整数乘法 mod 2³²

有没有人遇到过关于 int 和 uint 算术如何在 Actionscript 3 中工作的权威规范?(“权威”是指“来自 Adob​​e”或“已被 Adob​​e 宣布为权威”)。特别是我正在寻找一种受支持的方式来进行整数乘法模 2 32。这在我能找到的任何 Adob​​e 文档中都没有涉及。

Actionscript 声称基于 ECMAScript,但 ECMAScript 根本不做整数运算。它在 IEEE-754 上执行所有操作加倍,并在按位运算之前将结果模 2 32减少,这在大多数情况下模拟整数运算。但是,这不适用于乘法:乘法的真实结果,例如 0x10000001 * 0x0FFFFFFF 对于双精度数的尾数来说太长了,因此如果严格遵守规范,低位将丢失。

现在输入 Actionscript。我通过实验int发现,将两个或变量相乘uint并立即将产品转换为intuint似乎总是给我确切的结果。但是,生成的 AVM2 字节码只包含一个普通的“mul”指令,没有直接指示它应该产生一个整数结果而不是浮点结果;虚拟机必须向前看才能发现这一点。我担心我只是在实验中很幸运,并且获得了额外的精度作为奖励,而不是我可以依赖的东西。

(一方面,我的实验都是使用 x86 Flash 播放器进行的。也许它代表英特尔 80 位加倍的中间结果,或者将 64 位 int 存储在评估堆栈上,直到知道它将用于什么。两者都没有在没有本机 32×32→64 乘法指令的非 x86 平板电脑上很容易实现,所以 VM 可能只是决定将精度降低到 ECMAScript 标准指定的精度吗?)

24 小时状态: Mike Welsh 进行了一些有能力的调查并提供了非常有用的链接,但不幸的是还不足以关闭问题。还有谁?

(tl;博士评论中的辩论:whitequark 在某种程度上驳斥了我的假设原因之一,为什么答案可能是“否”。他的观点是有道理的,但当然不构成答案是“是”的证明)。

0 投票
2 回答
2434 浏览

c++ - 模棱两可的注入类名不是错误

我在 C++ 标准中读到的关于注入类名的内容与我将很快介绍的示例程序的行为相矛盾(如我所见)。这是我读到的:

  • 从 3.4(第 3 段)

    出于名称隐藏和查找的目的,类的注入类名称(第 9 条)也被认为是该类的成员。

  • 从 9 开始(第 2 段)

    类名被插入到在看到类名之后立即声明它的作用域中。类名也被插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。

从这些我了解到,以下是一个格式良好的翻译单元,它编译成功。

但是,我认为以下应该产生错误,但它没有

由于名称vector被注入到两者中std::vector<int>并且std::vector<char>好像是一个公共成员名称,那么它应该被 X 继承,因此vectorin 中的名称X应该是模棱两可的。我错过了什么吗?

PS我正在使用MSVC9.0

0 投票
5 回答
58461 浏览

c++ - C++ - 为什么不能用'const'限定符创建静态成员函数

今天我遇到了一个问题。我需要一个static成员函数,const不是必须的而是更好的。但是,我的努力没有成功。谁能说出为什么或如何?

0 投票
20 回答
30325 浏览

c++ - int a[] = {1,2,}; 为什么允许在初始化列表中使用尾随逗号?

也许我不是来自这个星球,但在我看来,以下应该是语法错误:

但事实并非如此。当这段代码在 Visual Studio 上编译时我很惊讶,但我已经学会了不信任 MSVC 编译器就 C++ 规则而言,所以我检查了标准,它被标准允许。不信的话可以看 8.5.1 的语法规则。

在此处输入图像描述

为什么允许这样做?这可能是一个愚蠢无用的问题,但我希望你明白我为什么要问。如果它是一般语法规则的子案例,我会理解 - 他们决定不让一般语法变得更加困难,只是不允许在初始化列表末尾使用多余的逗号。但是不,额外的逗号是明确允许的。...例如,在函数调用参数列表的末尾(当函数采用 时)不允许有多余的逗号,这是正常的

那么,再次明确允许这种多余的逗号有什么特别的原因吗?

0 投票
1 回答
73 浏览

c++ - 定义重复的异常规范是否合法

我已经在 g++ 4.4.3 中编译了上面的代码,没有任何错误。但是,我不确定这是否是基于标准的合法语法。