模板参数推导过程中丢失限定词

时间:2018-08-06 12:07:32

标签: c++ templates variadic-templates

由于我使用的是C ++ 11,因此我编写了自己的make_unique函数,该函数采用可变参数模板参数包并将其转发给std::unique_ptr构造函数。对于简单的数据类型,这很好用。但是,我试图构造的对象通过const引用接受其他类型的对象。但是,在传递const引用时,我得到了“转换失去了限定词”,即

struct A {};
struct B { B(const A& ob) { ... } };

A ob;
auto ptr = make_unique<B>(ob); // error here

// Definition of make_unique below:

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{ 
    return std::unique_ptr<T>{ new T{std::forward<Args>(args)...} } ;
}

我面临的错误是

Conversions loses qualifiers, cannot convert argument 1 from 'const A' to 'A &'.

如何解决该错误?据我了解,模板类型推导不是我期望的那样。

编译器:MSVC 2015更新3

2 个答案:

答案 0 :(得分:3)

这很可能是编译器错误。它可以与clang,g ++以及当前版本的MSVC 2017和2015配合使用。因此,我认为更新Visual Studio应该可以解决此问题。

working test example here

答案 1 :(得分:0)

事实证明,以上代码中的结构'B'确实将其构造函数参数更改为接受非const引用,但是文档没有相应的更新。谢谢大家的帮助!