문제

Sergey Ryazanov에 따르면 그의 엄청나게 빠른 C ++ 대표 비교할 수 없습니다 :

대표를 비교할 수 없습니다. 대의원은 방법에 대한 포인터가 포함되어 있지 않기 때문에 비교 연산자는 정의되지 않습니다. 스텁 함수에 대한 포인터는 다양한 컴파일 장치에서 다를 수 있습니다.

독자들이 대답 한 사람에게 :

"스텁 함수에 대한 포인터는 다양한 컴파일 장치에서 다를 수 있습니다." Afaik, 이것은 사실이 아닙니다. 컴파일러는 다른 컴파일 장치에서 생성 된 템플릿 기능을 재사용해야합니다 (이는 확실합니다. 그러나 Borland는이 규칙을 위반했다고 생각합니다). 클래스 ( 'Nameless'네임 스페이스가 아닌 클래스)가 외부 연결을 사용하고 스터브 기능을 사용하는 방식은 항상 감소하지 못하게 할 수 있기 때문입니다 (기능의 주소를 취하는 것도 문제가되지 않아야합니다. 비 인화 버전을 생성하고 링커가 수행하는 '외부 링키지'가 유사하게 명명 된 기능을 제외한 모든 것을 제거합니다 (표준에 의해 가정되고 동일해야 함) ...) ...

템플릿 함수 하나의 번역 장치 (CPP 파일)를 정의한 다음 다른 번역 장치에서 동일한 기능을 다르게 정의하면 두 버전 중 하나만 최종 실행 파일로 만듭니다. (이것은 실제로 "하나의 정의 규칙"을 위반하지만 적어도 MSVC에 대해서는 확실하지 않은 GCC에서 작동합니다.) 요점은 다음과 같습니다. 스텁의 주소는 다른 단위에서 동일합니다.

MSVC가 표준 회의 인 경우 이와 관련하여 MSVC에 사실이라고 생각하면 기사 (비교 기능 포함)를 업데이트 할 것을 촉구합니다.

이제 기사는 4 살이고 저자는 지난 3 년 동안 의견에 답장하지 않았으므로 위의 의견에 대한 장점 과이 특정 구현이 실제로 변경 될 수 있는지 궁금합니다. 지원 비교.

C ++ 표준은 그러한 사용법을 구체적으로 금지하고 있으며, 그렇다면 최근 컴파일러 중 어떤 것이 실제로 표준을 준수합니까?

도움이 되었습니까?

해결책

코드는 표준을 준수하며 정상입니다. 나는 그가 ODR을 위반하는 곳을 보지 못하고 동일한 템플릿 매개 변수를 가진 함수 템플릿의 모든 인스턴스화가 "동일한 주소"를 가져야한다는 것은 사실입니다 (함수의 포인터가 모두 동일해야한다는 의미에서) - 이것은 달성 된 것이 중요하지 않습니다. ISO C ++ 03 14.5.5.1 [temp.over.link]는 규칙을 자세히 설명합니다.

따라서 비교는 적합하고 휴대 가능한 방식으로 정의 될 수 있습니다.

다른 팁

소위 그루터기 기능 엄청나게 빠른 C ++ 대표 ~이다 정적 템플릿 멤버 함수, 기본적으로 템플릿 기능. 개선 된 변형에도 동일하게 적용됩니다 엄청나게 빠른 C ++ 대표단, 고정.

따라서 질문은 다음과 같습니다.

다른 번역 장치에서 템플릿 함수 (동일한 템플릿 매개 변수 및 정의 사용)의 인스턴스화가 동일한 함수 포인터 주소를 공유합니까?

C ++ 표준 (ISO C ++ 17, § 17.5.6.1)에 따르면 답은 다음과 같습니다. .

@Pavel이 그의 대답에서 말했듯이, ISO C ++ 03 표준에 동일하게 적용되었습니다 (ISO C ++ 03, § 14.5.5.1).

다시 말해이 접근법은 표준 준수이며 대의원은 안전하게 비교할 수 있습니다. 데이터가 동일한 함수에 바인딩 된 경우에만 동일한 객체와 동일한 객체를 비교합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top