繁体   English   中英

为什么是 <iterator> 的std :: size无法与原始数组参数一起使用

[英]Why is <iterator>'s std::size not working with raw array parameters

我通常在现代C ++的最高支持版本为C ++ 14的环境中工作。 我正在用c ++ 17中的<iterator>中的std::size进行实验,遇到以下问题/问题/缺乏理解。

在下面的代码片段中, main使用size(a)可以正常工作,但是print的用法拒绝编译,表明no matching function for call to 'size(int*&)'

我知道还有其他更好的方法可以做到这一点,但我想知道为什么它在一种情况下有效而在另一种情况下无效。

为了使用它,我使用了以下在线编译器,并简单地打开了-std=c++17标志。

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

void print(int a[])
{
   for(int i = 0; i < size(a); i++)
        cout << a[i] << endl;
}

int main() 
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    cout << "Directly" << endl;
    for(int i = 0; i < size(a); i++)
        cout << a[i] << endl;

    cout << "Via function" << endl;
    print(a);

    return 0;
}

第一次调用std::size使用此功能模板签名( 此处的重载设置为#3):

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept;

其中参数array尚未衰减为指针。 这是一个原始数组,其大小在其类型中进行了编码。 当您将这样的数组传递给接受int[] (或int*无关紧要)的函数时,该数组会衰减为指针,并且大小不再是该类型的一部分。 这就是为什么std::size(a)无法编译的原因。 简明:

为什么<iterator>std::size无法与原始数组参数一起使用?

是的,但是您尝试将其与指针一起使用,而不是与数组参数一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM