호출 할 때 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 과 함께 작동하는 유형 begin
과 end
결과에 따라 결정됩니다 .
에
sort(begin(foo), end(foo));
당신은 얻을
sort(std::vector<int>::iterator, std::vector<int>::iterator)
이후는 std::vector<int>::iterator
의 구성원 인 std
ADL의 발견 sort
에 std
와 호출이 성공합니다.
와
sort(begin(foo2), end(foo2));
당신은 얻을
sort(int*, int*)
int*
의 멤버가 아니기 때문에 std
ADL은 조사 std
하지 않으며 찾을 수 없습니다 std::sort
.
이것은 MSVC에서 작동하기 때문에
sort(begin(foo2), end(foo2));
된다
sort(std::_Array_iterator, std::_Array_iterator)
그리고 ADL 찾기의 std::_Array_iterator
일부 이기 때문에 . std
sort
이 동작은 두 컴파일러 모두 정확합니다. std::vector
및 std::array
유형은 그것이 만족을 제외하고 반복자에 사용되는 사항에 대한 모든 요구 사항이없는 LegacyRandomAccessIterator에 대한 요구 사항 및 C ++ 17 std::array
종류도 것이 LiteralType 및 C ++ (20)에이 것이 ConstexprIterator을