为什么我不能使用std :: begin/std :: end和int(*p)[3]而我可以使用int(&p)[3]?

Ric*_*ick 4 c++

这有效:

void foo(int (&a)[3]) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

void foo(int (*a)[3]) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}
Run Code Online (Sandbox Code Playgroud)

我考虑int (&a)[3]int (*a)[3]具有相同的含义!

zne*_*eak 8

您的代码类似于:

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);
}
Run Code Online (Sandbox Code Playgroud)

第一个作品和它的作品在第二个没有出于同样的原因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);
}
Run Code Online (Sandbox Code Playgroud)


asc*_*ler 7

我考虑int (&a)[3]int (*a)[3]具有相同的含义!

绝对不.int (&a)[3]声明对数组的引用,并int (*a)[3]声明一个指向数组的指针.这些在大多数方面是不同的,引用int和指针int是不同的.(虽然涉及C风格的数组时,自动数组到指针的转换有时会使事情变得复杂.)