gpt4 book ai didi

调用可变参数函数模板时的 C++11 不明确重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:44 24 4
gpt4 key购买 nike

能否请您解释一下为什么我有 error: call of overloaded ‘func(const Test&)’ is ambiguous尽管我使用显式模板实例化?

#include <iostream>

struct Test {
};

void func(const Test &) {
std::cout << "By Reference" << std::endl;
}

void func(const Test) {
std::cout << "By Value" << std::endl;
}

template <typename... TArgs>
void wrap(TArgs... args) {
func(args...);
}

int main() {
Test t;
wrap<const Test &>(t);
return 0;
};

编辑

产生歧义的原因是两个因素的结合。第一个是调用中应用的简单重载规则 func(args...) .二是简单的函数不能通过值和常量引用来重载。为了确保,可以替换调用 wrap<const Test &>(t)func(static_cast<const Test &>(t)) .错误仍然存​​在。

要解决这个问题,可以使用func 的函数模板。和值 vs const 引用模板特化,如@lubgr 提供的示例所示

感谢大家帮我揭开这个概念的神秘面纱。

最佳答案

出于同样的原因,以下调用是不明确的:

#include <iostream>
void foo(int) { std::cout << "val" << std::endl; }
void foo(const int&) { std::cout << "ref" << std::endl; }

int main()
{
int i = 1;
foo(i);
}

参见 here对该案例进行全面讨论。

关于调用可变参数函数模板时的 C++11 不明确重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52163877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com