【发布时间】:2015-05-26 23:03:50
【问题描述】:
我正在尝试使用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) } });
}
注意
- 我用 VS2013 和 g++ 都试过了,都出错了。
- 根据@chris,上面的代码编译在clang
- 标准是怎么说的?还是它实际上说明了什么?
【问题讨论】:
-
@chris libstdc++ 似乎只给出了错误。
-
该标准确实有前提条件:要求:p 应可转换为 T*。不过,我不知道它需要实现对前置条件做什么。我敢打赌 libstdc++(可能不使用 SFINAE)和 libc++(确实使用)都是正确的。
-
@chris:如果编译器不需要实现前置条件,那么它可能会令人困惑。我的猜测是,指针是不可转换的,所以不应该是一个模棱两可的调用。
-
@chris 违反 requires 部分会产生 UB。 SFINAE 在 remarks 子句中被强制执行。
标签: c++ c++11 shared-ptr language-lawyer overloading