当前使用C++20,GCC 11.1.0
我正在尝试创建一个类方法,该方法返回uint32_t
的std::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()
将自动衰减对其值类型的任何引用。
推导出的类型
V1
和V2
是std::decay<T1>::type
和std::decay<T2>::type
(应用于通过值传递的函数的自变量的常见类型转换(,除非std::decay
的应用导致某些类型X
的std::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
的生成放在一个单独的语句中仍然是必要的。很清楚这一事实。