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