std::与引用唯一指针配对

  • 本文关键字:指针 引用 std 唯一 c++
  • 更新时间 :
  • 英文 :


当前使用C++20,GCC 11.1.0

我正在尝试创建一个类方法,该方法返回uint32_tstd::pair和对唯一指针的引用。唯一指针来自作为变量存储在类中的唯一指针向量。然而,它一直在说:

error: could not convert ‘std::make_pair(_T1&&, _T2&&) [with _T1 = unsigned int; _T2 = std::unique_ptr<Panel>&; typename std::__strip_reference_wrapper<typename std::decay<_Tp2>::type>::__type = std::unique_ptr<Panel>; typename std::decay<_Tp2>::type = std::decay<std::unique_ptr<Panel>&>::type; typename std::__strip_reference_wrapper<typename std::decay<_Tp>::type>::__type = unsigned int; typename std::decay<_Tp>::type = unsigned int]((* &((Screen*)this)->Screen::panels.std::vector<std::unique_ptr<Panel> >::emplace_back<>()))’ from ‘pair<[...],std::unique_ptr<Panel>>’ to ‘pair<[...],std::unique_ptr<Panel>&>’
67 |         return std::make_pair<PanelID, Panel_Ptr&>(
|                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
|                                                   |
|                                                   pair<[...],std::unique_ptr<Panel>>
68 |             std::move(panelID), panels.emplace_back());
|             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Screen
{
private:
using PanelID = uint32_t;
using Panel_Ptr = std::unique_ptr<Panel>;
std::vector<Panel_Ptr> panels {};
public:
std::pair<PanelID, Panel_Ptr&> foo()
{
PanelID panelID {static_cast<PanelID>(panels.size())};
return std::make_pair<PanelID, Panel_Ptr&>(
std::move(panelID), panels.emplace_back());
}
};

std::make_pair()将自动衰减对其值类型的任何引用。

推导出的类型V1V2std::decay<T1>::typestd::decay<T2>::type(应用于通过值传递的函数的自变量的常见类型转换(,除非std::decay的应用导致某些类型Xstd::reference_wrapper<X>,在这种情况下推导出的型型是X&

https://en.cppreference.com/w/cpp/utility/pair/make_pair

删除std::make_pair()类型参数的显式实例化,并用std::ref:包装emplace_back()调用

return std::make_pair(
std::move(panelID), 
std::ref(panels.emplace_back())
);

或者,您可以明确地使std::pair:

return std::pair<PanelID, Panel_Ptr&>(
std::move(panelID), 
panels.emplace_back()
);

最后,请注意您的代码,您在PanelID类型上调用std::move(),尽管它只是一个整数。std::move()在这种情况下是无用的,因此完全删除它会使代码更加清晰。

尽管如此,由于传递给函数的参数的求值顺序未指定,将panelID的生成放在一个单独的语句中仍然是必要的。很清楚这一事实。

最新更新