Vit*_*meo 5 c++ templates perfect-forwarding auto c++14
我创建了一个std::forward完全相同的别名std::forward.
template<class T>
constexpr decltype(auto) fwd(T mValue) noexcept
{
return std::forward<T>(mValue);
}
Run Code Online (Sandbox Code Playgroud)
然后我更换了所有出现的std::forward<...>与fwd<...>我的代码库.
编译所有项目g++ 4.9- 所有测试都通过,一切正常.
然后我尝试编译clang++ 3.5.有些测试似乎随机失败,原因是fwd<...>.std::forward<...>再次更换它修复了失败的测试.
我尝试fwd<...>使用尾随返回类型语法编写,因为我认为decltype(auto)不起作用:
template<class T>
constexpr auto fwd(T mValue) noexcept -> decltype(std::forward<T>(mValue))
{
return std::forward<T>(mValue);
}
Run Code Online (Sandbox Code Playgroud)
相同的结果:g++工作,clang++不.
然后我查找了std::forwardcppreference 的签名,并实现了我的别名:
template<class T>
constexpr T&& fwd(std::remove_reference_t<T>& t) { return std::forward<T>(t); }
template<class T>
constexpr T&& fwd(std::remove_reference_t<T>&& t) { return std::forward<T>(t); }
Run Code Online (Sandbox Code Playgroud)
这有效(所有测试都通过)g++和clang++.
为什么decltype(auto)版本不起作用?它不应该返回完全相同的返回类型std::forward吗?
您忘记将 mValue 声明为移动引用
template <typename T>
constexpr decltype(auto) fwd(std::remove_reference_t<T> &&mValue)
{
return std::forward<T>(mValue);
}
template <typename T>
constexpr decltype(auto) fwd(std::remove_reference_t<T> &mValue)
{
return std::forward<T>(mValue);
}
Run Code Online (Sandbox Code Playgroud)