首页 > 解决方案 > 为什么我不能将 std::begin/std::end 与 int(*p)[3] 一起使用,而我可以与 int(&p)[3] 一起使用?

问题描述

这有效:

void foo(int (&a)[3]) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}

虽然这不是:

void foo(int (*a)[3]) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}

我考虑int (&a)[3]int (*a)[3]意思一样!

标签: c++

解决方案


您的代码类似于:

void foo(vector<int>& a) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}

void foo(vector<int>* a) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}

第一个有效,第二个无效,原因与它int (&a)[3]int (*a)[3]. 当您使用指向集合的指针而不是引用时,您需要在将它们传递给标准库的begin/时取消引用它们end

void foo(vector<int>* a) {
    auto ibegin = begin(*a);
    auto ebegin = end(*a);
}

void foo(int (*a)[3]) {
    auto ibegin = begin(*a);
    auto ebegin = end(*a);
}

推荐阅读