重载std::unique_ptr参数函数出现调用歧义,如何区分调用?
如何区分调用两个重载的checkManager函数?
你实现了两个重载的checkManager函数:
std::unique_ptr<Manager>& checkManager(std::unique_ptr<Manager> &p1) { if(p1 && p1->getName().find("Manager") != std::string::npos ){ std::cout<<"Manager exists"<<endl; } return p1; } // 按值传递unique_ptr的重载版本 std::unique_ptr<Manager> checkManager(std::unique_ptr<Manager> p1) { if(p1 && p1->getName().find("Manager")!=std::string::npos) { std::cout<<"Manager exists"<<endl; } return std::move(p1); }
调用auto& resultRef = checkManager(mp1);时出现编译错误,提示**"more than one instance of overloaded function 'checkManager' matches the argument list"**,但auto result = checkManager(std::move(mp1));可以正常运行,原因是:
当传入左值mp1时,编译器的重载决议认为两个版本都可行——第一个版本接受左值引用参数,第二个版本可以尝试通过拷贝构造接收参数(虽然std::unique_ptr禁止拷贝,但编译器在重载决议阶段不会检查这个规则,仅进行参数匹配),因此产生歧义。
以下是分别调用两个重载函数的方法:
调用左值引用版本
通过显式强制转换为对应函数指针类型,明确指定要调用的重载:
// 先定义函数指针类型,提升可读性 using LRefCheckFunc = std::unique_ptr<Manager>&(*)(std::unique_ptr<Manager>&); auto& resultRef = static_cast<LRefCheckFunc>(checkManager)(mp1);
或者直接在调用时强制转换:
auto& resultRef = static_cast<std::unique_ptr<Manager>&(*)(std::unique_ptr<Manager>&)>(checkManager)(mp1);
调用值传递版本
除了你已经使用的std::move(mp1)将左值转为右值(此时只有值传递版本能匹配),也可以通过显式强制转换指定调用:
// 定义函数指针类型 using ValueCheckFunc = std::unique_ptr<Manager>(*)(std::unique_ptr<Manager>); auto result = static_cast<ValueCheckFunc>(checkManager)(std::move(mp1));
或者直接调用:
auto result = static_cast<std::unique_ptr<Manager>(*)(std::unique_ptr<Manager>)>(checkManager)(std::move(mp1));
另外,std::move(mp1)能正常匹配值传递版本的原因是:它将左值mp1转换为右值,而右值无法绑定到非const左值引用参数,因此此时只有接受值传递的重载版本符合匹配规则,不会产生歧义。
内容的提问来源于stack exchange,提问作者user265906
相关产品推荐
相关产品推荐

