c++ - std::forward 的实现

标签 c++ c++11

我正在阅读 Overview of the New C++ (C++11/14) (PDF only) ,在幻灯片 288 它给出了 std::forward:

的实现
template<typename T>                // For lvalues (T is T&),
T&& std::forward(T&& param)         // take/return lvalue refs.
{                                   // For rvalues (T is T),
    return static_cast<T&&>(param); // take/return rvalue refs.
}

然后在文本中给出另一个实现:

The usual std::forward implementation is:

template<typename T>
struct identity {
    typedef T type;
};
template<typename T>
T&& forward(typename identity<T>::type&& param)
{
    return static_cast<identity<T>::type&&>(param);
}

有什么区别?为什么后者是通常的实现方式?

最佳答案

第一个问题是你可以写std::forward(x) ,它不会做你想要的,因为它总是产生左值引用。

第二种情况的参数是非推导上下文,防止模板参数的自动推导。这迫使你写 std::forward<T>(x) ,这是正确的做法。

另外,第二个重载的参数类型应该是 typename identity<T>::type&因为 std::forward 的惯用输入始终是左值。

编辑:该标准实际上要求一个与此等效的签名(顺便说一句,这正是 libc++ 所拥有的):

template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;

关于c++ - std::forward 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501400/

相关文章:

c++ - X11 上的编辑框

c++ - 使用 SFINAE 的代码与 GCC 一起使用,但不与 Clang 一起使用

c++ - 在循环中创建线程 vector 的问题

c++ - c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突

c++ - 什么是集成到高性能应用程序中的好脚本语言?

c++ - 错误 LNK2019 : unresolved external symbol - what am I doing wrong?

c++ - 辅助类 - 私有(private)嵌套类与仅在实现文件中声明和定义的类

C++ concat const char 与 char

c++ - 为子类使用父类构造函数

c++ - 对类静态 constexpr 结构的 undefined reference ,g++ vs clang