调用可变参数模板是不明智的

时间:2015-10-27 11:01:57

标签: c++ templates ambiguous

我有一个可变参数模板函数,除非我使用与T相同类型的参数调用它,否则它将起作用。

template <typename T, typename... Arg>
std::shared_ptr<T> make_shared(Arg&&... arg)
{
    return std::shared_ptr<T>(new T(std::forward<Arg>(arg)...));
}

工作电话:

auto sahredStr = make_shared<std::string>("fubar"); 

暧昧的电话:

std::string str = "fubar";
auto sharedStr = make_shared<std::string>(str);  

我想了解第二次通话有什么问题。

LIVE DEMO

1 个答案:

答案 0 :(得分:2)

对于使用非限定名称调用函数,名称查找过程还会考虑声明参数类型(及其类型模板参数)的名称空间 - 也称为参数依赖查找 。对于std::string类型的参数,这意味着还会在make_shared命名空间中搜索std函数。因此,可行的重载集合还包括std::make_shared函数,因此含糊不清。

解决方案是更改函数名称以避免与std重载冲突,或者用括号括起函数名称:

auto sharedStr = (make_shared<std::string>)(str);
//              ~^~                      ~^~