前向引用与右值[重复]

问题描述 投票:0回答:1

最低限度的实施:

#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';
}

问题: 可以使用哪种策略将其转换为通用引用,同时仍然确保参数必须是数组?

c++ sfinae c++-concepts forwarding-reference
1个回答
4
投票

您可以通过

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>&&
不是转发引用,不会推导引用的类型,也不会应用引用折叠,它只是一个右值引用。

© www.soinside.com 2019 - 2024. All rights reserved.