我试图用initialization_list作为参数过载函数,并使用可变参数来接受地图和向量以及整数。编译器抱怨函数解析不明确。我想知道是什么原因造成的歧义,以及如何解决它。
#include <memory>
#include <iostream>
#include <map>
#include <initializer_list>
std::shared_ptr<int> foo(const std::initializer_list<std::pair<const std::string, std::shared_ptr<int> > >& il)
{
return std::make_shared<int>();
}
std::shared_ptr<int> foo(const std::initializer_list<std::shared_ptr<int> > & il)
{
return std::make_shared<int>();
}
std::shared_ptr<int> foo(int num)
{
return std::make_shared<int>();
}
int main()
{
foo({ { "a", foo(10) } });
}Try It OUT >>>
Note
发布于 2015-03-23 19:53:35
是什么导致了歧义
shared_ptr有一个带有两个参数的构造函数:
template<class Y, class D> shared_ptr(Y* p, D d);它与初始化列表{ "a", foo(10) }和pair匹配。(或者,如果不是的话,那么就足够接近一些编译器来出错了。确切的规则会融化我的大脑,所以我不会试图找出哪个编译器在技术上是正确的。)
如何解决这个问题
假设您想要第一个重载,那么提供一个pair类型,而不是一个更通用的初始化列表:
foo({ std::make_pair( "a", foo(10) ) });标准怎么说?或者它真的说了什么?
它说了很多,通常是用相当不透明的语言。我不能引用20页的over.match,也没有语言律师的技能来总结他们在这里的应用,同时保持我的理智。
https://stackoverflow.com/questions/29219024
复制相似问题