overload-resolution 相关问题

重载分辨率是一种语言机制,可以在几个可行的函数重载中进行选择。即使对于有经验的用户来说,它的规则也很复杂且经常令人惊讶。

带参数包的过载解决方案

说我有这两种方法: // 重载 1 模板 void Foo(Args&&... args) { // 用 T 做事,args... } // 重载 2 模板 说我有这两种方法: // Overload 1 template <typename T, typename... Args> void Foo(Args&&... args) { // do things with T, args... } // Overload 2 template <typename T, typename... Args> void Foo(std::function<void(T&)> && func, Args&&... args) { // do things with func, T, args... } 我试着这样称呼它: Foo<MyClass>([](auto& my_class){ // do things with my_class }); 我打算调用 Overload 2。问题是它实际上解决了 Overload 1。我可以通过创建一个明确的 std::function<void(MyClass&)> func 变量并在删除 std::function 上的 r 值后传递它来使其工作,但我想尝试让它与 lambda 一起工作。如果我提供另一个参数,它也可以与 lambda 一起使用,但我不会有另一个参数给它。 带有std::function参数的方法不应该更专业吗?为什么选择错误的重载?我已经阅读了 overload resolution 规则,但我没有看到/理解这种行为的原因。 鉴于它与显式参数一起使用的事实,我假设它与从 lambda 到 std::function 的隐式转换有关,该转换的排名低于仅使用 Args,即使它更多专门。我能做些什么来保留 lambda? lambda 不是 std::function,所以第一次重载是更好的匹配。 我能做些什么来保留 lambda? 使用常规模板参数代替std::function: template <typename T, typename F, typename... Args> requires (std::invocable<F, T&>) void Foo(F&& func, Args&&... args) { // ... } 演示

回答 1 投票 0

过载分辨率和用户定义的转换

考虑这个例子: struct Foo { Foo(int){cout << "Foo(int)\n";}。Foo(double){cout << "Foo(double)\n";} operator int()const{cout << "operator int()\n"; return 0;} ... ...

回答 1 投票 2

为什么传递一个long long时,会调用一个有两个类型为double的参数的重载函数?

我写了这两个重载:int func(int,int) { return 1; } int func(double,double) { return 2; }当我用明显的两种调用方案调用它们时,即func(1,1)和func(1.0,1......。

回答 1 投票 2

为什么传递一个long long时,会调用一个有两个类型为double的参数的重载函数?

我写了这两个重载:int func(int, int) { return 1; } int func(double, double) { return 2; }。当我用明显的两种调用方案调用它们时,即func(1,1)和func(1.0,1...。

回答 1 投票 9

C++中,如果两个模板函数都符合参数列表,会调用哪个模板?

模板 void fn(T t){}模板。 虚空 fn(std::vector) vt){} void f() { std::vector vt; fn(vt); }。我知道,第二个模板函数将是...

回答 1 投票 3

Swift:通用重载,"更专业 "的定义。

在下面的例子中,为什么foo(f)的调用是模糊的?我知道第二个重载也可以适用于P == (),但为什么第一个重载不被认为更专业,因此是一个 ...

回答 1 投票 1

如何从重载解析中删除重载函数?

假设我有一个类STest,我希望它能够隐式地转换为char const*,而不是bool。 struct STest { operator char const*() const& { return "abc"; } operator bool() const& ...

回答 1 投票 2

Java-为什么我被迫将引用构造函数转换为Supplier,否则Java声称该方法不明确?

我具有以下定义的接口,该接口打算由3d向量的所有实现方式实现:公共接口IVector3 扩展了IVector {......] [ 主要是因为它无法通过方法引用甚至lambda来推断类型。如果仅让它知道您正在调用cross方法的类型上下文,则该方法将起作用。例如,此- return IVector3.<Float, Vector3f>cross(Vector3f::new, vector0, vector1);

回答 1 投票 1

关于 noexcept 的超载是否有意义?

我正在尝试了解 noexcept 功能。 我知道这可能会令人困惑,但除此之外,如果可能的话,不能从调用函数中推断出 noexcept 。 这是 t...的一个非工作示例

回答 2 投票 0

编译器之间的重载分辨率不同

我已经构建了以下最小的问题示例:#include struct Foo {Foo(){std :: cout <

回答 1 投票 3

了解解决函数重载的编译器选择

我正在将方言设置为C ++ 17的int = 32位(gcc臂无eabi,皮质M3,GCC版本9)的平台上进行编译。我有一个方法重载的模板版本和简单的方法...

回答 1 投票 0

如何返回3个值之间的最大值?

我正在尝试使用max函数返回最大值,但不适用于3个值。 CodeBlocks错误:错误:'__comp'不能用作函数代码:#include ... ] >>>>

回答 2 投票 1

错误:“ operator ==”不匹配,但确实在基类上定义

struct BaseA {自动运算符==(const BaseA&other)const {返回other.a == a;} int a; };结构B {int b; }; struct A:public BaseA {auto operator ==(const B&other)const {...

回答 1 投票 1

如何对java.util.Arrays.toString使用静态导入?

请考虑以下两个简单的Java代码段:import java.util.Arrays;类Okay {公共静态void main(String ... args){System.out.println(Arrays.toString(new int [0])); } ...

回答 1 投票 1

为什么超载解析无法确定要重载函数的哪个版本来初始化std :: function对象?

我有关于std :: function的示例:int add(int x,int y,int z){返回x + y + z;} int add(int a,int b){返回a + b;} int main(){std :: function fn = add; //错误...

回答 1 投票 0

C ++重载解析-模糊匹配

我正在尝试使用以下测试代码尝试一些基本的重载解决方案概念:void foo(){void F(int x,int y); // F1 void F(char x,double y); // F2 ...

回答 1 投票 0

对C#的扩展方法重载解决方案感到困惑

请考虑以下代码:使用系统;使用System.Linq;使用System.Collections.Generic;公共静态类Ex {公共静态IEnumerable Take (此IEnumerable ...] >>

回答 2 投票 0

具有两个(或多个)特定包(专业化/重载)的可变函数模板

函数'Process'正在使用可变数量的可变类型参数。为了处理不同的情况,我已经像这样成功地重载了它://一般情况模板

回答 3 投票 3

Java重载:如何调用更具体的一个

我的程序解析WebAssembly指令并根据当前指令的上下文进行决策。因此,我算法的MWE如下所示:public class Main {public interface ...

回答 1 投票 0

具有隐式转换的过载分辨率

我基本上希望为string / FormattableString提供两个单独的重载(背景是我希望促使人们倾向于将字符串常量用于日志消息并通过结构化的参数传递参数。

回答 2 投票 2

© www.soinside.com 2019 - 2024. All rights reserved.