最低限度的实施:
#include <array>
#include <iostream>
template <typename T>
auto universal_ref(T&& arr)
{
for (auto && v : arr)
std::cout << v << '\n';
}
template <typename T, size_t N>
auto not_universal_ref(std::array<T, N>&& arr)
{
for (auto && v : arr)
std::cout << v << '\n';
}
问题: 可以使用哪种策略将其转换为通用引用,同时仍然确保参数必须是数组?
您可以通过
T
要求 std::array<U,N>
是一些 std::enable_if
:
template <typename T> struct is_array : std::false_type {};
template <typename U,std::size_t N> struct is_array<std::array<U,N>> : std::true_type {};
template <typename T>
std::enable_if_t<is_array<std::decay_t<T>>::value> universal_ref(T&& arr)
{
for (auto && v : arr)
std::cout << v << '\n';
}
据我所知,该语言中没有任何内容指定什么是转发引用。它仅仅是模板参数推导和引用折叠规则,它们控制着当您调用
T
时如何推导 universal_ref
。因此,在您的其他示例中, std::array<T,N>&&
不是转发引用,不会推导引用的类型,也不会应用引用折叠,它只是一个右值引用。