问题标签 [language-specifications]
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.
c# - 运算符 '==' 不能应用于类型 T?
我认为这种方法是有效的,但我错了:
阅读规范后(v3.0 中的第 7.2.4 节和 v4.0 中的第 7.3.4 节):
7.2.4 二元运算符重载决议
x op y 形式的运算,其中 op 是可重载的二元运算符,x 是 X 类型的表达式,y 是 Y 类型的表达式,处理如下:
确定由 X 和 Y 为操作算子 op(x, y) 提供的候选用户定义算子集合。该集合由 X 提供的候选运算符和 Y 提供的候选运算符的并集组成,每个运算符都使用第 7.2.5 节的规则确定。如果 X 和 Y 是相同的类型,或者如果 X 和 Y 派生自一个共同的基本类型,则共享候选运算符仅在组合集中出现一次。
如果候选用户定义运算符的集合不为空,则这成为该操作的候选运算符集合。否则,预定义的二元运算符 op 实现,包括它们的提升形式,将成为该运算的候选运算符集。给定运算符的预定义实现在运算符的描述中指定(第 7.7 节到第 7.11 节)。
§7.4.3 的重载决策规则应用于候选运算符集,以选择关于参数列表 (x, y) 的最佳运算符,该运算符成为重载决策过程的结果。如果重载决策未能选择单个最佳运算符,则会发生编译时错误。
在第 2 步中,我认为应该应用这个预定义的实现:
因为 C# 中的所有内容都派生自 Object。步骤 3 中如何发生编译时错误?我认为在这种情况下“重载分辨率无法选择”是不可能的。
编辑当我实施这样的事情时,我想到了这个问题:
恐怕我需要构建一个表达式并在Equals
方法中动态调用它。
c# - C# 短/长/int 文字格式?
在 C/C#/等中。你可以告诉编译器一个文字数字不是它看起来的样子(即,float
而不是double
,unsigned long
而不是int
):
等等
有人可以指出这些清单吗?我正在专门寻找short
or的后缀Int16
。
c++ - 为什么这个 C++ 显式模板特化代码是非法的?
(注意:我知道它是非法的,我正在寻找语言使其如此的原因。)
错误:
与谷歌的快速通过发现了这个规范的引用,但它只提供了什么而不是为什么。
编辑:
一些回应转发了这样的论点(例如证实了我的推测),即规则是这样的,因为否则会违反单一定义规则(ODR)。然而,这是一个非常弱的论点,因为在这种情况下,它不成立,原因有两个:
- 将显式专业化移动到另一个翻译单元可以解决问题,并且似乎不会违反 ODR(或者链接器说)。
- ODR 的简短形式(应用于函数)是任何给定函数都不能有多个主体,而我没有。唯一定义函数体的地方是显式特化,因此调用
Foo<int>
不能定义模板的泛型特化,因为没有要特化的泛型体。
对此事的猜测:
关于为什么存在该规则的猜测:如果第一行提供了定义(而不是声明),那么实例化之后的显式特化将是一个问题,因为您将获得多个定义。但在这种情况下,唯一的定义是显式专业化。
奇怪的是以下(或我正在处理的真实代码中的类似内容)有效:
档案一:
文件 B:
但是使用它通常会开始创建意大利面条导入结构。
c++ - 这可以在 C++ 中合法地完成吗?
注意:以下代码是非法的,但不需要符合要求的编译器拒绝它(有些则不需要)。
在我正在使用的库中,我有一个模板函数声明Foo
和一个模板函数定义Bar
in foobar.h
:
目的是其他代码可以像这样使用它:
问题: 有没有办法使这项工作也合法?
问题是(如果我理解正确的话)尽管编译,这在技术上是非法的:它违反了ODR,因为明确的专业化和使用Bar<MyClass>
count 作为定义,尽管事实上没有实体可以使用用例。
我想使用此模式进行参数化的原因Foo
是,由于我必须遵循样式指南,确保在定义之前以词法方式包含任何内容的唯一方法是Bar
将其包含在foobar.h
. 但是(出于我希望我不需要解释的原因)这不是首发。
c++ - 关于对象生命周期的问题:N3242 Draft
C++11 n3242“子对象的持续时间,对象生命周期”,3.8/1 中的一点:
对象的生命周期是对象的运行时属性。如果一个对象是一个类或聚合类型,并且它或它的一个成员由一个普通默认构造函数以外的构造函数初始化,则称该对象具有非普通初始化[注意:普通复制/移动构造函数的初始化是非普通的- 简单的初始化。——尾注]
T 类型对象的生命周期开始于:
- 获得具有适合类型 T 的对齐和大小的存储,并且
- 如果对象有非平凡的初始化,它的初始化就完成了。
T 类型对象的生命周期在以下情况下结束:
- 如果 T 是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或者
- 对象占用的存储空间被重用或释放。
在这里,他们谈到了具有对象生命周期的琐碎或非琐碎的复制/移动构造函数。任何人都可以用一些示例程序来解释这一点吗?
点的变化描述了类型对象的生命周期何时T
开始,但没有提及何时T
结束。为什么?
objective-c - Objective-C 2.0 ABI 规范
Objective-C 2.0 ABI 的文档是否存在于 Internet 上的某个地方?发布说明objc4-493.9
说:
即将发布的文档将描述仅用于编译器和开发工具的 ABI。
从那以后它被释放了吗?最接近的此类参考是 Apple 的Objective-C 运行时参考,但这仅描述了面向公众的 API,而不是实现细节。事实上,它甚至顺便提到了 ABI:
此外,新的 Objective-C ABI(此处未描述)[...]
不幸的是,新的 ABI 在上述文本中没有超链接。:-) 我唯一的选择是了解objc4
运行时和 Clang 的CGObjCNonFragileABIMac
代码生成项目的源代码吗?
c# - 为什么 C# 不允许泛型属性?
我想知道为什么我不能像拥有泛型方法那样在非泛型类中拥有泛型属性。IE:
我读了@Jon Skeet 的答案,但这只是一个声明,很可能在规范中的某个地方。
我的问题是为什么实际上是这样的?这种限制是否避免了一些问题?
java - 为什么 Java 中不允许用 Foo(Object[]) 重载 Foo(Object...)?
我想知道为什么 Java 中不允许重载Foo(Object[] args)
with Foo(Object... args)
,尽管它们以不同的方式使用?
像这样使用:
而另一种形式:
像这样使用:
这背后有什么原因吗?
c# - C# 和 C++ 中的 ++i 运算符区别
我有以下用 C++ 和 C# 编写的代码
在这个 C# 编译器带来错误之后
但是 C++ 编译器生成此代码时没有错误,我得到的结果11
为i
. 这种差异的原因是什么?
f# - F# 规范符号运算符 VS 符号关键字
我正在阅读 F# 规范——我能找到的最新的规范,在这里找到——以努力以可以说是困难的方式学习该语言。在“3.6 符号关键字”部分中,规范指出:
以下符号或部分符号字符序列被视为关键字:
在下一节“3.7 符号运算符”中,它指出:
用户定义和库定义的符号运算符是如下所示的字符序列,除非字符序列是符号关键字(第 3.6 节)。
我可能遗漏了一些明显的东西,但在我看来,规范声明运算符/关键字、、、、和?
都是符号关键字和符号运算符。那么……他们是哪一个?我如何知道天气以使用符号关键字标记或符号运算符标记?@>
@@>
<@
<@@
在此先感谢,布兰登
编辑要清楚,我想知道为什么规范说明符号运算符可以在声明它们不能之后立即成为这些符号。