【发布时间】:2018-08-06 12:07:32
【问题描述】:
由于我使用的是 C++11,因此我编写了自己的 make_unique 函数,该函数采用可变参数模板参数包并将其转发给 std::unique_ptr 构造函数。这适用于简单的数据类型。但是,我尝试构造的对象通过 const 引用接受其他类型的对象。然而,在传递 const 引用时,我得到“Conversions lost qualifiers”,即
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
【问题讨论】:
-
这与
g++-8和clang编译得很好。 -
尝试使用普通括号代替大括号初始化 T:
new T(std::forward<Args>(args)...)。 -
确实,sn-p 甚至可以在 g++4.8 及更高版本中工作,也可以在 clang 中工作。在最近一次结帐后,我将不得不查看“A”类构造函数中是否发生了某些变化(可能是它们接受非常量引用)。
-
似乎也正在使用 MSCV 2015U3:godbolt.org/g/HXZH5D
标签: c++ templates variadic-templates