규정되지 않은 sort () — std :: array가 아닌 std :: vector에서 사용될 때 컴파일되는 이유는 무엇입니까? 3};

호출 할 때 std::sort()A의 std::array:

#include <vector>
#include <array>
#include <algorithm>

int main() {
    std::vector<int> foo{4, 1, 2, 3};
    sort(begin(foo), end(foo));

    std::array<int, 4> foo2{4, 1, 2, 3};
    sort(begin(foo2), end(foo2));
}

GCC와 그 소리 복귀상의 종류에 오류가 두 std::array– 그 소리가 말한다

오류 : 선언되지 않은 식별자 ‘정렬’사용; ‘std :: sort’를 의미 했습니까?

std::sort(begin(foo2), end(foo2))문제 를 해결하기 위해 변경 .

MSVC는 작성된대로 위의 코드를 컴파일합니다.

std::vector와 사이의 치료 차이가 왜 std::array; 어떤 컴파일러가 맞습니까?



답변

이것은 Argument Dependent Lookup 과 함께 작동하는 유형 beginend결과에 따라 결정됩니다 .

sort(begin(foo), end(foo));

당신은 얻을

sort(std::vector<int>::iterator, std::vector<int>::iterator)

이후는 std::vector<int>::iterator의 구성원 인 stdADL의 발견 sortstd와 호출이 성공합니다.

sort(begin(foo2), end(foo2));

당신은 얻을

sort(int*, int*)

int*의 멤버가 아니기 때문에 stdADL은 조사 std하지 않으며 찾을 수 없습니다 std::sort.

이것은 MSVC에서 작동하기 때문에

sort(begin(foo2), end(foo2));

된다

sort(std::_Array_iterator, std::_Array_iterator)

그리고 ADL 찾기의 std::_Array_iterator일부 이기 때문에 . stdsort

이 동작은 두 컴파일러 모두 정확합니다. std::vectorstd::array유형은 그것이 만족을 제외하고 반복자에 사용되는 사항에 대한 모든 요구 사항이없는 LegacyRandomAccessIterator에 대한 요구 사항 및 C ++ 17 std::array종류도 것이 LiteralType 및 C ++ (20)에이 것이 ConstexprIterator을


답변