运行时大小的数组和指针

我在新的C ++ 14运行时大小的数组上测试了type_traits头中的一些工具,请考虑下面的代码:

int g[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

template <typename T> void print(T &t)
{
    std::cout << "Type id:    " << typeid(T).name() << 'n';
    std::cout << "is_array:   " << std::is_array<decltype(T)>::value << 'n';
    std::cout << "is_pointer: " << std::is_pointer<decltype(T)>::value << 'n';
    std::cout << "extent:     " << std::extent<decltype(T)>::value << 'n';
}

int main()
{
    print(g);
    return 0;
}

静态大小的数组g返回以下输出:

Type id:    A11_i
is_array:   1
is_pointer: 0
extent:     11

在未重整名称A11_i我假设是int类型的11种元素 rray因此所有是正确的在这里,但这个新的代码:

void f(std::size_t s)
{
    int a[s];
    print(a);
}

int main()
{
    f(5);
    return 0;
}

我收到错误:

In function 'void f(std::size_t)':
error: no matching function for call to 'print(int [s])'

note: candidate is:
note: template<class T> void print(T&)
note:   template argument deduction/substitution failed:
note:   variable-sized array type 'int [s]' is not a valid template argument

我没有料到size参数可以传递给模板,但我期待着一个自动的数组到指针的衰减。 我猜T &的参数不适合这种衰减,所以我试图将模板签名更改为:

template <typename T> void print(T *&t)

有类似的结果:

In function 'void f(std::size_t)':
error: no matching function for call to 'print(int [s])'

note: candidate is:
note: template<class T> void print(T*&)
note:   template argument deduction/substitution failed:
note:   mismatched types 'T*' and 'int [s]'

我注意到,运行时大小的数组上的大小变量似乎与类型绑定(而不是mismatched types 'T*' and 'int [ 5 ]'我们得到mismatched types 'T*' and 'int [ s ]' )这看起来很奇怪。

那么,问题是什么?

  • 为什么我在这个运行时大小的数组中没有得到数组到指针的衰减?
  • 用于调整运行时大小数组类型的运行时大小数组部分的变量,还是我误解了错误?

  • 在模板参数推导过程中,仅当函数模板参数的类型不是引用时才使用数组到指针的转换。

    §14.8.2.1从函数调用中推导出模板参数[temp.deduct.call]

    1模板参数推导通过比较每个函数模板参数类型(称为P )和呼叫的相应参数的类型(称为A )来完成,如下所述。 [...]

    2如果P不是参考类型:

  • 如果A是数组类型,则使用由数组到指针标准转换(4.2)生成的指针类型来代替类型推导的A ; 除此以外,
  • [...]
  • 链接地址: http://www.djcxy.com/p/25631.html

    上一篇: Runtime sized arrays and pointer

    下一篇: How to apply video filtering in android?