创建“std::forward”别名-意外的结果
Creating an `std::forward` alias - unexpected results
我创建了一个std::forward
别名,其行为应与std::forward
完全相同。
template<class T>
constexpr decltype(auto) fwd(T mValue) noexcept
{
return std::forward<T>(mValue);
}
然后,我在我的代码库中用fwd<...>
替换了所有出现的std::forward<...>
。
用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);
}
相同的结果:g++
有效,clang++
无效。
然后,我在cppreference上查找了std::forward
的签名,并实现了我的别名,如下所示:
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); }
这在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);
}
相关文章:
- 尝试将字符串/字符转换为整数会产生意外结果
- RapidXML - 代码创建意外结果
- 类中静态函数C++意外结果
- 指针数组中的意外结果
- 使用指针访问数组元素时出现意外结果
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- C++:比较运算符>和字符串文本的意外结果
- 具有意外结果的 C++ 闭包
- yaml-cpp 比较的意外结果
- 每次都出现意外结果
- 在 Qt 中解析嵌套的 JSON 时出现意外结果(数组不存在)
- 如何避免 std::abs 的意外结果?
- 使用嵌套 if 语句的意外结果
- A ^= B ^= A ^= B;C# Visual Studio 中的意外结果
- 逻辑错误,我将获得意外结果
- 在 c++ 中使用异步的意外结果
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- 执行递增和递减时"cout"链接会产生意外结果
- OpenCL - 内核方法返回意外结果
- C++使用 std::get_time 解析 YYMMDD ISO 8601 日期字符串会得到意外结果