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

标签 c++ c++11 standards perfect-forwarding 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
}

我的编译器是带有 -std=c++17 的 clang 7.0。

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

最佳答案

首先,这些被官方称为“转发引用”,而不是“通用引用”

你的 static_assert 失败是因为 T 在将左值传递给采用 的函数时被推断为 T&”转发引用” - 这是 “转发引用” 的特殊规则之一,适用于模板参数推导。

您可以通过先去除任何引用来修复您的断言:

static_assert(std::is_array_v<std::remove_cvref_t<T>>); 

live example on godbolt.org


std::remove_cvref_t是一个前沿的 C++20 特性——如果您的编译器不支持它,您可能想使用 std::remove_reference_t

关于c++ - 为什么通用引用不适用于数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53206090/

相关文章:

c++ - 使用类似策略模式的文件解析器 - 如何获得结果?

c - 复合语句( block )是否被 ANSI C 中的括号表达式包围?

C++ 包含结构

c++ - 为什么对象的静态初始化肯定为零?

c++ - 使用类型转换创建对 unique_ptr 中对象的引用

c++ - 运算符重载的基本规则和惯用法是什么?

c++ - 是否有用于解析小数的良好 C++ 工具?

c++ - 在函数中使用 vector 指针时出错

c++11 - 将一个 shared_ptr 分配给另一个

mysql - 在 MySQL 中使用 SELECT * 的潜在负面影响是什么?