왜“b <a? “a <b? b : a”max 템플릿을 구현 하시겠습니까? < a then yield a else yield

C ++ 템플릿-전체 안내서, 2 판 에서는 최대 템플릿을 소개합니다 .

template<typename T>
T max (T a, T b)
{
  // if b < a then yield a else yield b
  return  b < a ? a : b;
}

그리고 “b < a ? a : b”대신 다음을 사용하여 설명합니다 “a < b ? b : a”.

[StepanovNotes]에 따른 max () 템플릿은 의도적으로“b <a? “a <b? b : a”를 사용하여 두 값이 같지만 같지 않더라도 함수가 올바르게 작동하는지 확인하십시오.

even if the two values are equivalent but not equal.” 를 이해하는 방법 ? “a < b ? b : a”나에게 동일한 결과가있는 것 같습니다.



답변

std::max(a, b)실제로 a는 둘이 동일 할 때 리턴하도록 지정됩니다 .

즉의 실수로 간주 Stepanov 가 제공하는 유용한 속성을 나누기 때문에 다른 사람 ab당신은 항상 종류를 함께 할 수 있습니다 {min(a, b), max(a, b)}; 이를 위해 인수가 동등한 경우 max(a, b)반환 하려고 합니다 b.


답변

이 답변은 주어진 코드가 C ++ 표준 관점에서 잘못된 이유를 설명하지만 상황에 맞지 않습니다.

상황에 대한 설명은 @TC 의 답변 을 참조하십시오 .


표준은 std::max(a, b)다음과 같이 정의 합니다 [alg.min.max] (강조는 내 것입니다) :

template<class T> constexpr const T& max(const T& a, const T& b);

요구 사항 : 유형 T가 LessThanComparable (표 18)입니다.

결과 : 더 큰 값.

비고 : 인수가 동일한 경우 첫 번째 인수를 반환합니다.

여기서 동등한 !(a < b) && !(b < a)것은 true [alg.sorting # 7] 입니다.

특히 경우 ab동등한 양 a < b하고 b < a있는 false우측의 값이되도록 :하므로, 조건 연산자에 반환한다 a그래서, 오른쪽에 있어야한다 :

a < b ? b : a

… 정답 인 것 같습니다. 이것은 libstdc ++libc ++에서 사용하는 버전 입니다.

따라서 인용문의 정보는 현재 표준에 따라 잘못된 것처럼 보이지만 정의 된 컨텍스트가 다를 수 있습니다.


답변

요점은 동등 할 때 어떤 것이 반환되어야 하는가이다. 이 경우에는 첫 번째 인수 std::max를 반환 a해야합니다.

같으면를 반환합니다 a.

따라서 a < b ? b : a사용해야합니다. 반면에 잘못 b < a ? a : b;반환 b됩니다.

(@Holt가 말했듯이 인용문은 정반대로 보입니다.)

“두 값은 같지만 같지 않다”는 의미는 비교할 때 동일한 값을 갖지만 다른 측면에서는 다른 객체 일 수 있습니다.

예 :

struct X { int a; int b; };
bool operator< (X lhs, X rhs) { return lhs.a < rhs.a; }
X x1 {0, 1};
X x2 {0, 2};
auto x3 = std::max(x1, x2); // it's guaranteed that an X which cantains {0, 1} is returned


답변