为什么通用引用不适用于数组?

xml*_*lmx 4 c++ standards perfect-forwarding c++11 forwarding-reference

#include <type_traits>

template<typename T>
void f(const T&)
{
    static_assert(std::is_array_v<T>); // ok
}

template<typename T>
void g(T&&)
{
    static_assert(std::is_array_v<T>); // error
}

int main()
{
    char arr[8];
    f(arr); // ok
    g(arr); // error
}
Run Code Online (Sandbox Code Playgroud)

我的编译器是clang 7.0 with -std=c++17.

为什么通用引用不适用于数组?

Vit*_*meo 11

首先,这些被正式称为"转发参考",而非 "通用参考".

您的static_assert失败是由于T推导出T&将左值传递给采用"转发引用"的函数时的事实- 这是在模板参数推断期间应用的"转发引用"的特殊规则之一.

您可以先删除任何引用来修复断言:

static_assert(std::is_array_v<std::remove_cvref_t<T>>); 
Run Code Online (Sandbox Code Playgroud)

godbolt.org上的实例


std::remove_cvref_t是一个前沿的C++ 20功能 - std::remove_reference_t如果你的编译器不支持它,你可能想要使用它.