#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
}
我的编译器是带有的clang 7.0 -std=c++17
。
为什么通用引用不适用于数组?
首先,这些正式称为“转发参考”,而不是“通用参考”。
您的static_assert
失败是由于以下事实:将左值传递给带有“转发引用”的函数时,这T
是推论-这是模板参数推导过程中适用的“转发引用”的特殊规则之一。T&
您可以通过先删除所有引用来修复断言:
static_assert(std::is_array_v<std::remove_cvref_t<T>>);
std::remove_cvref_t
是C ++ 20的最新功能-std::remove_reference_t
如果编译器不支持,则可能要使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句