2013-07-13 1 views
3

아래 예제 코드에서 오버로드 된 연산자 < const 정규화 된 및 Visual C++에서 (모든 버전에서 2013 년 미리보기까지) 컴파일하지만 Clang , 그것은 오류를 던집니다 - 참고 : 후보 함수가 실행 가능하지 않습니다 : 'this'인수는 'const Entry'유형이지만 메서드는 const bool 연산자 < (const 항목 & 기타)으로 표시되지 않습니다. Visual C++ 관계 연산자 오버로드 const 정확성 (std :: sort 함께)

#include "stdafx.h" 
#include <vector> 
#include <algorithm> 

struct Entry 
{ 
    unsigned int age; 
    bool operator<(const Entry& other) // !!! no const qualification here !!! 
    { 
     return age < other.age; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<Entry> entries; 
    for(unsigned int i = 0; i < 100; ++i) 
    { 
     Entry entry; 
     entry.age = i; 
     entries.push_back(entry); 
    } 
    // Sort by age 
    std::sort(entries.begin(), entries.end()); 
    return 0; 
} 

는/관계 연산자 비교의 CONST-정확성을 시행 비주얼 C++되지 표준 순응인가? 아니면 std :: sort와 관련이 있습니까?

+3

아마도'std :: sort' 구현 문제 : clang은'const' 컨텍스트에서 객체를 비교하고 VC++는 그렇지 않습니다. 일반적으로 clang과 VC++가 동의하지 않으면 VC++의 구현에 오류가 있기 때문입니다. :) – Yakk

답변

3
는 더 일정하지 않은 함수 제 sort에 전달 될 수 Compare 펑의 관점에서 진술하여 간접 참조 반복자 통해인가되지 않는다는 가정

은 C++ 표준 상태 있음 :

Compare 함수 객체 유형 (20.8)입니다. 문맥 적으로 bool (4)로 변환 될 때 Compare 유형의 객체 에 적용된 함수 호출 작업의 반환 값은 호출의 첫 번째 인수가 두 번째보다 작은 이면 true를 반환하고 그렇지 않으면 false를 반환합니다. Comparecomp은 순서 관계를 가정하는 알고리즘에 대해 전체적으로 사용됩니다. comp은 역 참조 된 이터레이터을 통해 비 상수 함수를 적용하지 않을 것이라고 가정합니다. Compareoperator< 관계를 명시함으로써

(강조 광산) 다음

하고 : Compare을 모든 알고리즘 들어

대신 operator< 사용하는 버전이있다. 즉, comp(*i, *j) != false의 기본값은 *i < *j != false입니다. 을 올바르게 처리하기 위해 25.4.3에서 설명한 알고리즘이 아닌 알고리즘의 경우 comp은 값에 대해 약한 순서를 유도해야합니다.

두 개의 인용 부호가 있습니다. 에서 25.4 정렬 및 관련 작업.

그러므로 회원 operator<const이어야한다는 명시 적으로 명시되지는 않았지만 이것이 가정되어야한다고 가정합니다. comp에 제한을 설정하고 operator<에 설정하지 않는 것은 의미가 없습니다.

Visual C++는 dereferenced iterators에서 non-const 함수를 호출 할 수 있기 때문에 여기에 오류가 있습니다.