36 lines · c
1//===-- forward utility -----------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_FORWARD_H9#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_FORWARD_H10 11#include "src/__support/CPP/type_traits/is_lvalue_reference.h"12#include "src/__support/CPP/type_traits/remove_reference.h"13#include "src/__support/macros/attributes.h"14#include "src/__support/macros/config.h"15 16namespace LIBC_NAMESPACE_DECL {17namespace cpp {18 19// forward20template <typename T>21LIBC_INLINE constexpr T &&forward(remove_reference_t<T> &value) {22 return static_cast<T &&>(value);23}24 25template <typename T>26LIBC_INLINE constexpr T &&forward(remove_reference_t<T> &&value) {27 static_assert(!is_lvalue_reference_v<T>,28 "cannot forward an rvalue as an lvalue");29 return static_cast<T &&>(value);30}31 32} // namespace cpp33} // namespace LIBC_NAMESPACE_DECL34 35#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_FORWARD_H36