我的带有通用引用的模板功能不起作用

aik*_*khs 2 c++ c++14

我想做一个灵活的模板函数,可以同时使用rvalue和lvalue。我是这样写的:

template<typename T>
decltype(auto) normalize_pose(T&& pose)
{
    if (pose > 2 * M_PI) return std::forward<T>(pose - 2* M_PI);
} 
Run Code Online (Sandbox Code Playgroud)

所以我仔细检查了功能,对我来说似乎是正确的。然后,我决定对其进行测试并写道:

int a = 2;
auto test = factorgraph::normalize_pose(a);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

 error: use of ‘decltype(auto) factorgraph::normalize_pose(T&&) [with T = int&]’ before deduction of ‘auto’
Run Code Online (Sandbox Code Playgroud)

如果我尝试添加<int>,则会收到错误消息,指出不存在这样的功能。

Jar*_*d42 8

它应该是

if (pose > 2 * M_PI) return std::forward<T>(pose) - 2* M_PI;
Run Code Online (Sandbox Code Playgroud)

std::forward仅适用于变量。

并且您还需要返回else分支的值(必须满足相同类型 decltype(auto))。

但对于您而言,这很简单:

template<typename T>
auto normalize_pose(const T& pose)
{
    return (pose > 2 * M_PI) ? pose - 2 * M_PI : pose;
}
Run Code Online (Sandbox Code Playgroud)

处理所有案件。

  • @Edmund现在的代码确实是您想要的。使用`decltyp(auto)`来获取返回的引用是行不通的,因为`pose-2 * M_PI`的类型与`pose`的类型不同。为了使`decltype(auto)`工作,所有控制路径都需要返回相同的类型,在这种情况下您不能这样做。 (3认同)
  • 由于`decltype(auto)`,它仍然无法工作。您真的要返回参考吗? (2认同)