【问题标题】:Losing qualifiers during template argument deduction在模板参数推导期间丢失限定符
【发布时间】: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++-8clang 编译得很好。
  • 尝试使用普通括号代替大括号初始化 T:new T(std::forward&lt;Args&gt;(args)...)
  • 确实,sn-p 甚至可以在 g++4.8 及更高版本中工作,也可以在 clang 中工作。在最近一次结帐后,我将不得不查看“A”类构造函数中是否发生了某些变化(可能是它们接受非常量引用)。
  • 似乎也正在使用 MSCV 2015U3:godbolt.org/g/HXZH5D

标签: c++ templates variadic-templates


【解决方案1】:

这很可能是编译器错误。它适用于 clang、g++ 以及当前版本的 MSVC 2017 和 2015。所以我想更新你的 Visual Studio 应该可以解决这个问题。

working test example here

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2012-12-06
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多