首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数重载与initialization_list造成歧义

函数重载与initialization_list造成歧义
EN

Stack Overflow用户
提问于 2015-03-23 19:45:38
回答 1查看 168关注 0票数 3

我试图用initialization_list作为参数过载函数,并使用可变参数来接受地图和向量以及整数。编译器抱怨函数解析不明确。我想知道是什么原因造成的歧义,以及如何解决它。

代码语言:javascript
复制
#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

  1. 我试过使用VS2013和g++,它们都出错了。
  2. 如@chris所示,上面的代码在嘎吱声中编译
  3. 标准怎么说?或者它真的说了什么?
EN

回答 1

Stack Overflow用户

发布于 2015-03-23 19:53:35

是什么导致了歧义

shared_ptr有一个带有两个参数的构造函数:

代码语言:javascript
复制
template<class Y, class D> shared_ptr(Y* p, D d);

它与初始化列表{ "a", foo(10) }pair匹配。(或者,如果不是的话,那么就足够接近一些编译器来出错了。确切的规则会融化我的大脑,所以我不会试图找出哪个编译器在技术上是正确的。)

如何解决这个问题

假设您想要第一个重载,那么提供一个pair类型,而不是一个更通用的初始化列表:

代码语言:javascript
复制
foo({ std::make_pair( "a", foo(10) ) });

标准怎么说?或者它真的说了什么?

它说了很多,通常是用相当不透明的语言。我不能引用20页的over.match,也没有语言律师的技能来总结他们在这里的应用,同时保持我的理智。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29219024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档