【问题标题】:Why doesn't universal reference apply for arrays?为什么通用引用不适用于数组?
【发布时间】:2018-11-08 10:44:36
【问题描述】:
#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。

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

【问题讨论】:

    标签: c++ c++11 standards perfect-forwarding forwarding-reference


    【解决方案1】:

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

    您的static_assert 失败是因为T 在将左值传递给采用“转发引用”的函数时被推断为T&amp; - 这是特殊规则之一在模板参数推导期间应用的“转发引用”

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

    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

    【讨论】:

      【解决方案2】:

      template argument deduction 发生时的相关规则是:

      从函数调用中推导
      ...
      4、如果P是对一个无cv限定模板参数的右值引用(所谓的转发引用),并且对应的函数调用参数是一个左值,用A的类型左值引用代替A进行推导.

      因此,在您的情况下,arr 被推断为 引用 arr,因此 static_assert 失败。

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 2020-08-31
        • 2021-10-31
        • 2018-03-01
        相关资源
        最近更新 更多