我想做一个灵活的模板函数,可以同时使用rvalue和lvalue。这是我的写法:
template<typename T>
decltype(auto) normalize_pose(T&& pose)
{
if (pose > 2 * M_PI) return std::forward<T>(pose - 2* M_PI);
}
所以我仔细检查了该功能,对我来说似乎是正确的。然后,我决定对其进行测试并写道:
int a = 2;
auto test = factorgraph::normalize_pose(a);
我收到此错误:
error: use of ‘decltype(auto) factorgraph::normalize_pose(T&&) [with T = int&]’ before deduction of ‘auto’
如果我尝试添加<int>
,则会收到错误消息,提示不存在此类功能。
答案 0 :(得分:8)
应该是
if (pose > 2 * M_PI) return std::forward<T>(pose) - 2* M_PI;
仅将std::forward
应用于变量。
并且您还需要返回else分支的值(相同类型以满足
decltype(auto)
。
但对于您而言,这很简单:
template<typename T>
auto normalize_pose(const T& pose)
{
return (pose > 2 * M_PI) ? pose - 2 * M_PI : pose;
}
处理所有案件。