重载分辨率是一种语言机制,可以在几个可行的函数重载中进行选择。即使对于有经验的用户来说,它的规则也很复杂且经常令人惊讶。
最近,我在面试中被问到这个问题: 以下代码将调用哪个 Vector 构造函数? #包括 类迭代器{ 民众: 迭代器(int &x): ptr_(&am...
说我有这两种方法: // 重载 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) { // ... } 演示
考虑这个例子: struct Foo { Foo(int){cout << "Foo(int)\n";}。Foo(double){cout << "Foo(double)\n";} operator int()const{cout << "operator int()\n"; return 0;} ... ...
为什么传递一个long long时,会调用一个有两个类型为double的参数的重载函数?
我写了这两个重载:int func(int,int) { return 1; } int func(double,double) { return 2; }当我用明显的两种调用方案调用它们时,即func(1,1)和func(1.0,1......。
为什么传递一个long long时,会调用一个有两个类型为double的参数的重载函数?
我写了这两个重载:int func(int, int) { return 1; } int func(double, double) { return 2; }。当我用明显的两种调用方案调用它们时,即func(1,1)和func(1.0,1...。
模板 void fn(T t){}模板。 虚空 fn(std::vector) vt){} void f() { std::vector vt; fn(vt); }。我知道,第二个模板函数将是...
在下面的例子中,为什么foo(f)的调用是模糊的?我知道第二个重载也可以适用于P == (),但为什么第一个重载不被认为更专业,因此是一个 ...
假设我有一个类STest,我希望它能够隐式地转换为char const*,而不是bool。 struct STest { operator char const*() const& { return "abc"; } operator bool() const& ...
Java-为什么我被迫将引用构造函数转换为Supplier,否则Java声称该方法不明确?
我具有以下定义的接口,该接口打算由3d向量的所有实现方式实现:公共接口IVector3 扩展了IVector {......] [ 主要是因为它无法通过方法引用甚至lambda来推断类型。如果仅让它知道您正在调用cross方法的类型上下文,则该方法将起作用。例如,此- return IVector3.<Float, Vector3f>cross(Vector3f::new, vector0, vector1);
我正在尝试了解 noexcept 功能。 我知道这可能会令人困惑,但除此之外,如果可能的话,不能从调用函数中推断出 noexcept 。 这是 t...的一个非工作示例
我已经构建了以下最小的问题示例:#include struct Foo {Foo(){std :: cout <
我正在将方言设置为C ++ 17的int = 32位(gcc臂无eabi,皮质M3,GCC版本9)的平台上进行编译。我有一个方法重载的模板版本和简单的方法...
我正在尝试使用max函数返回最大值,但不适用于3个值。 CodeBlocks错误:错误:'__comp'不能用作函数代码:#include ... ] >>>>
错误:“ 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 {...
如何对java.util.Arrays.toString使用静态导入?
请考虑以下两个简单的Java代码段:import java.util.Arrays;类Okay {公共静态void main(String ... args){System.out.println(Arrays.toString(new int [0])); } ...
为什么超载解析无法确定要重载函数的哪个版本来初始化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; //错误...
我正在尝试使用以下测试代码尝试一些基本的重载解决方案概念:void foo(){void F(int x,int y); // F1 void F(char x,double y); // F2 ...
请考虑以下代码:使用系统;使用System.Linq;使用System.Collections.Generic;公共静态类Ex {公共静态IEnumerable Take (此IEnumerable ...] >>
函数'Process'正在使用可变数量的可变类型参数。为了处理不同的情况,我已经像这样成功地重载了它://一般情况模板
我的程序解析WebAssembly指令并根据当前指令的上下文进行决策。因此,我算法的MWE如下所示:public class Main {public interface ...