问题标签 [overload-resolution]
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# - 默认参数和泛型的方法解析问题
使用 .NET 4,我对编译器无法解析下面示例中的第一个方法调用感到困惑。
任何人都可以对此有所了解吗?我怀疑除了修改我的 API 以帮助编译器(如上所述)之外,我真的没有前进的道路Extensions3
,但如果有更简单/更好的方法,那么我很想听听。
c# - 在 C# 中解决方法重载的优先级规则是什么?
我正在编写一个序列化程序,我想在其中广泛使用方法重载,序列化派生自 的类型的对象IEnumerable<T>
等等IDictionary<K,V>
。
我还打算使用dynamic
关键字让 CLR 根据要序列化的对象的运行时类型选择正确的重载。
看看这个代码片段:
我想这样做:
现在基于 的运行时类型obj
,将调用正确的重载。例如,
在这种情况下,调用了第三个重载,其基本原理非常简单:这只是可行的选择。
但是,如果我这样做:
它调用第一个重载。我不完全明白这一点。当所有三个重载都是可行的选项时,为什么它会解决第一个重载?
事实上,如果我删除第一个重载,则调用第二个重载,如果我删除第一个和第二个重载,则调用第三个重载。
解决方法重载的优先规则是什么?
c# - 非虚拟方法解析 - 为什么会发生这种情况
我对如何解析非虚拟方法的理解(在 C# 中)是它取决于变量的类型(而不是实例的类型)。
看看下面的代码。
控制台窗口显示以下内容:
这对我来说没有意义,我相信会让很多人陷入困境。如果您现在将变量车辆声明为 VehicleBase 类型,您将得到
这也是我在前一种情况下所期望的,因为方法 Accelerate 是非虚拟的。
在前面的输出中,(变量车辆类型为 Sedan,我希望调用 Sedan.Accelerate 而不是 VehicleBase.Accelerate。就目前而言,取决于您从哪里调用它(从类中或从外部)行为正在改变。
在我看来,重新引入方法的重载解决规则优先,但我很难相信这是正确/预期的行为。
c++ - 可变参数列表与单个模板参数:标准怎么说?
考虑以下代码:
我不明白为什么标记为“single”的行编译得很好(在 g++ 4.6.3 下)并且不会产生重载解决问题。c++11 标准是否说具有固定数量参数的模板函数优于具有相同签名的可变参数函数?
c++ - 为什么具有固定底层类型 char 的枚举值解析为 fct(int) 而不是 fct(char)?
这个问题是在用 enums 回答关于重载解析的问题时出现的。
虽然这种情况long long
肯定是 MSVC2012NovCTP 中的一个错误(根据标准文本和 gcc 4.7.1 的测试),但我无法弄清楚为什么会发生以下行为:
MSVC2012NovCTP 和 gcc 4.7.1 都同意这个输出:
fct(char)
fct(int)
不A
应该从转换charEnum
为char
?为什么A
被转换为int
?
编辑:clang 抱怨这个电话是模棱两可的,这与我在下面的解释一致;也就是说,如果仅将其视为基础类型,我仍然会发现它更加直观。
两个相关的标准摘录是§7.2/9:
枚举数或无作用域枚举类型的对象的值通过整数提升(4.5)转换为整数
和§4.5/4:
其基础类型是固定的(7.2)的无作用域枚举类型的纯右值可以转换为其基础类型的纯右值。此外,如果可以将整型提升应用于其基础类型,则其基础类型固定的无范围枚举类型的纯右值也可以转换为提升的基础类型的纯右值。
所以charEnum
既可以转换为char
,也可以是任何整数提升char
,例如int
.
但这对我来说很模糊,因为“可以”并不能完全说明实际会选择哪个。如果有的话,这应该与这个措辞模棱两可,因为在任何促销活动之间char
或任何促销活动之间都没有优先考虑。如果您注释掉fct(int)
,则该调用是模棱两可的。为什么int
特别?
我唯一能想到的是积分提升是递归应用的,但我没有看到任何强制它。
c++ - 2 参数函数的重载分辨率不正确
让我们看下面的示例程序:
在VS 2010中,这编译得很好(暂时忽略明显的链接器错误)。但在VS 2012中,这给了我:
错误 C2440:“conversion”:无法从“float”转换为“half_float::half”
因此,重载解析似乎不是从命名空间中选择版本half_float
(ADL 应该完成),而是从std
使用隐式转换到float
. 但奇怪的是,这只发生在atan2
通话中而不是sin
通话中。
在较大的项目中,这个错误实际上首先发生在我身上,它也发生在其他 2 参数函数(或者更确切地说具有 2 个half
参数的函数)中,例如fmod
,但不会发生在任何 1 参数函数中。同样,在较大的项目中,它也适用于gcc 4.6/4.7和clang 3.1,没有错误,尽管我没有在那里明确测试这个 SSCCE 版本。
所以我的问题是,这种错误行为是在VS 2012方面(假设它只发生在2012 年并且只发生在 2-argument 函数中),还是我监督了重载解决规则中的一些微妙之处(这确实可以得到一个有点棘手,我猜)?
编辑:如果我直接using namespace half_float
或直接将整个东西放在全局命名空间中,也会发生这种情况。同样,如果我不是using namespace std
,它也会发生,但这更像是将数学函数放在全局命名空间中的 VS 实现。
编辑:它发生在原始VC 2012编译器以及它的2012 年 11 月 CTP中。
编辑:虽然我不完全确定它是否真的违反了最严格意义上的标准,但我已经根据我的回答中的发现提交了一个错误,因为它至少与 1- 的定义不一致参数功能,值得VS团队进一步调查。
c# - 从重载集中获得最佳匹配重载
假设我有一堂课如下:
现在,如果我尝试在代码中使用它,我会使用这样的东西:
它是 7 的原因是因为重载决议更喜欢 [ IList<object>
] 而不是 [ IEnumerable<object>
] 和 [ object
],并且因为 [ string
, int=default
] 优先于 [ object
]。
在我的场景中,我想使用反射获得最佳匹配的重载。换句话说:“最佳”被定义为“c#重载决议”。例如:
虽然我绘制的场景只有 1 个参数,但我寻求的解决方案可以有多个参数。
更新 1:
因为我收到一条评论,由于重载解决方案实现的困难(我很清楚),这对 SO 来说太难了,我倾向于发送更新。为了给我的论点一些力量,这是我的第一次尝试,它使用处理重载决议的默认 .NET 绑定器:
这个版本似乎已经正确地进行了简单的重载解析,但无法使用可选参数。因为 .NET afaik 与我在这里展示的类型绑定一起工作,所以我认为该解决方案可以相当容易地实现。
c++ - 'operator=' 的模棱两可的重载与 c++11 std::move 以及复制和交换习语
我收到以下错误:
编译以下代码时:
编译时g++ -std=c++11 main.cpp && ./a.out
:
有人可以帮我理解为什么在这种情况下使用复制和交换习语时会出现歧义吗?
c# - 应用运算符时的重载分辨率 | 到不同类型的枚举
在阅读了最近的问题之后,在另一个枚举声明中允许不同枚举类型之间的操作,但在其他地方不允许,我想出了这个例子:
编译结果:Gamma
不会编译(CS0266:无法将类型“ulong”隐式转换为“long”。存在显式转换(您是否缺少演员表?))。Delta
编译愉快。
这难道不是 C# 语言规范所期望的吗?
Alpha
(注意:如果我将要初始化的成员更改为负常量,例如-1L
,那么既Gamma
不会也Delta
不会编译。)
c++ - 将函数标记为虚拟会导致编译器错误,unique_ptr
我有一个包装矢量的模板类。我正在尝试将 unique_ptrs 存储在此类中,并且效果很好。但是,当我将该void add(const T& elem)
函数标记为虚拟时,我的编译器 (clang) 告诉我,我正在为 unique_ptr 进行“调用隐式删除的复制构造函数”。
我知道 unique_ptrs 不能被复制,所以这就是我创建该void add(T&& elem)
函数的原因。我只是不知道为什么将另一个添加函数标记为虚拟会导致编译器错误。
谢谢你的时间。