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

xmllmx
#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>>); 

Godbolt.org上的实时示例


std::remove_cvref_t是C ++ 20的最新功能-std::remove_reference_t如果编译器不支持,则可能要使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么@Autowired不适用于通用类型T?

为什么“ a或b或c”不适用于NumPy数组?

为什么相等检查不适用于数组

为什么每个循环不适用于JSON数组

为什么数组公式不适用于整个列?

为什么静态数组不适用于 JPA?

为什么自调用不适用于Spring代理(例如,使用AOP)?

为什么异步调用不适用于回调模式?

我的替换函数适用于数组,但不适用于也是数组的 HTML 集合。为什么?

为什么const double &&不适用于左值引用?

为什么复合赋值或迭代运算符不适用于解除引用的指针

为什么绑定函数不适用于解引用迭代器?

Firestore中“数组包含”查询不适用于引用

为什么我的函数适用于矩阵但为什么不适用于向量?

为什么console.table()不适用于所有对象/数组?

为什么多态性不适用于C ++中的数组?

jQuery inArray()函数不适用于动态生成的数组,为什么?

为什么“.includes”不适用于我的二维数组?

为什么 skimage 均值过滤器不适用于浮点数组?

为什么Java中的toString方法似乎不适用于数组

为什么v-model不适用于数组和v-for循环?

为什么我的布尔数组不适用于 CCC 的问题拉格曼?

NonNullable 不适用于通用属性

通用方法不适用于参数

通用lambda不适用于参数

为什么std :: begin()和std :: end()可用于固定数组,但不适用于动态数组?

为什么Hibernate HSQL Concat不适用于MSSQL?

为什么constexpr不适用于构造函数?

为什么忽略SIGTRAP不适用于asm?