Namespaces
Variants

Comparison operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

인수를 비교합니다.

연산자 이름 구문 오버 로딩 가능 프로토타입 예시 ( class T 에 대해)
클래스 정의 내부 클래스 정의 외부
같음 a == b Yes bool T :: operator == ( const U & b ) const ; bool operator == ( const T & a, const U & b ) ;
같지 않음 a != b Yes bool T :: operator ! = ( const U & b ) const ; bool operator ! = ( const T & a, const U & b ) ;
미만 a < b bool T :: operator < ( const U & b ) const ; bool operator < ( const T & a, const U & b ) ;
Greater than a > b Yes bool T :: operator > ( const U & b ) const ; bool operator > ( const T & a, const U & b ) ;
작거나 같음 a <= b Yes bool T :: operator <= ( const U & b ) const ; bool operator <= ( const T & a, const U & b ) ;
크거나 같음 a >= b bool T :: operator >= ( const U & b ) const ; bool operator >= ( const T & a, const U & b ) ;
3-way 비교 (C++20) a <=> b Yes R T :: operator <=> ( const U & b ) const ; [1] R operator <=> ( const T & a, const U & b ) ; [1]
참고 사항
  • 내장 연산자가 bool 을 반환하는 경우, 대부분의 사용자 정의 오버로드 bool 을 반환하여 사용자 정의 연산자가 내장 연산자와 동일한 방식으로 사용될 수 있도록 합니다. 그러나 사용자 정의 연산자 오버로드에서는 모든 타입이 반환 타입으로 사용될 수 있습니다( void 포함).
  • U T 를 포함한 모든 타입이 될 수 있습니다.
  1. 1.0 1.1 R operator<=> 의 반환 타입입니다( 아래 참조 )

목차

양방향 비교

양방향 비교 연산자 표현식의 형식은 다음과 같습니다

관계 연산자
lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
**참고:** 주어진 지침에 따라 HTML 태그, 속성, ` ` 태그 내부의 C++ 연산자 및 lhs/rhs 용어는 번역하지 않고 원본을 유지했습니다. 표의 구조와 서식도 완벽하게 보존되었습니다.
동등 연산자
lhs == rhs (5)
lhs != rhs (6)
1) lhs rhs 보다 작으면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.
2) true 를 반환합니다, 만약 lhs rhs 보다 크다면. 그렇지 않으면 false 를 반환합니다.
3) lhs rhs 보다 작거나 같으면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.
4) true 를 반환합니다, 만약 lhs rhs 보다 크거나 같으면. 그렇지 않으면 false 를 반환합니다.
5) true 를 반환합니다, 만약 lhs rhs 와 같다면. 그렇지 않으면 false 를 반환합니다.
6) true 를 반환합니다. lhs rhs 와 같지 않으면, false 를 반환합니다.

내장 이중 비교 연산자

내장된 이항 비교 연산자의 경우, 좌측값에서 우측값으로의 변환 , 배열에서 포인터로의 변환 (C++26까지) 함수에서 포인터로의 변환 lhs rhs 에 적용됩니다.

이 변환들을 적용하기 전에 lhs rhs 모두 배열 타입을 가질 경우 비교 연산은 사용이 권장되지 않습니다.

(since C++20)
(until C++26)

내장 관계 연산자의 경우, 한 피연산자가 포인터일 때 다른 피연산자에 배열-포인터 변환 이 수행됩니다.

내장 동등 연산자의 경우, 한 피연산자가 포인터이거나 널 포인터 상수 일 때 다른 피연산자에 배열-포인터 변환이 수행됩니다.

(since C++26)

내장된 양방향 비교 연산자의 경우, 결과는 bool prvalue입니다.

내장 산술 비교

변환된 피연산자들이 모두 산술 타입이나 열거형 타입(범위 있는 또는 없는)을 가지는 경우, 일반 산술 변환 이 두 피연산자에 대해 수행됩니다. 값들은 변환 후에 비교됩니다:

#include <iostream>
int main()
{
    static_assert(sizeof(unsigned char) < sizeof(int),
                  "Cannot compare signed and smaller unsigned properly");
    int a = -1;
    int b = 1;
    unsigned int c = 1;
    unsigned char d = 1;
    std::cout << std::boolalpha
              << "두 개의 부호 있는 값 비교:\n"
                 " -1 == 1 ? " << (a == b) << "\n"
                 " -1 <  1 ? " << (a <  b) << "\n"
                 " -1 >  1 ? " << (a >  b) << "\n"
                 "부호 있는 값과 부호 없는 값 비교:\n"
                 // may issue different-signedness warning:
                 " -1 == 1 ? " << (a == c) << "\n"
                 // may issue different-signedness warning:
                 " -1 <  1 ? " << (a <  c) << "\n"
                 // may issue different-signedness warning:
                 " -1 >  1 ? " << (a >  c) << "\n"
                 "부호 있는 값과 더 작은 부호 없는 값 비교:\n"
                 " -1 == 1 ? " << (a == d) << "\n"
                 " -1 <  1 ? " << (a <  d) << "\n"
                 " -1 >  1 ? " << (a >  d) << '\n';
}

출력:

두 개의 부호 있는 값 비교:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false
부호 있는 값과 부호 없는 값 비교:
 -1 == 1 ? false
 -1 <  1 ? false
 -1 >  1 ? true
부호 있는 값과 더 작은 부호 없는 값 비교:
 -1 == 1 ? false
 -1 <  1 ? true
 -1 >  1 ? false

내장 포인터 동등 비교

동등 연산자 == != 의 변환된 피연산자는 std::nullptr_t 타입, (C++11부터) 포인터 타입 또는 멤버 포인터 타입을 가질 수 있습니다.

내장 포인터 동등 비교에는 세 가지 가능한 결과가 있습니다: 동등, 비동등 및 지정되지 않음. 내장 포인터 동등 비교를 위한 동등 연산자가 생성하는 값은 아래와 같습니다:

비교 결과
of p and q
반환 값
p == q p ! = q
같음 true false
다름 false true
지정되지 않음 지정되지 않은 bool

변환된 lhs rhs 중 적어도 하나가 포인터인 경우, 포인터 변환 , 함수 포인터 변환 (C++17부터) 한정 변환 이 양쪽 변환된 피연산자에 수행되어 복합 포인터 타입 으로 만듭니다. 복합 포인터 타입의 두 포인터는 다음과 같이 비교됩니다:

  • 다른 완전한 비배열 객체의 끝을 지난 주소를 나타내거나,
  • 다른 완전한 배열 객체의 마지막 요소를 지난 주소를 나타내는 경우,
비교 결과는 명시되지 않습니다.
  • 그렇지 않고 두 포인터가 모두 null이거나, 둘 다 같은 함수를 가리키거나, 둘 다 같은 주소를 나타내는 경우(즉, 같은 객체를 가리키거나 객체의 끝을 지나는 경우), 두 포인터는 같다고 비교됩니다.
  • 그렇지 않으면 포인터는 다르다고 비교됩니다.

변환된 lhs rhs 중 적어도 하나가 멤버 포인터인 경우, 멤버 포인터 변환 , 함수 포인터 변환 (C++17부터) 한정 변환 이 두 변환된 피연산자에 수행되어 복합 포인터 타입 으로 만듭니다. 복합 포인터 타입의 두 멤버 포인터는 다음과 같이 비교됩니다:

  • 두 멤버 포인터가 모두 널 멤버 포인터 값인 경우, 두 포인터는 같음으로 비교됩니다.
  • 두 멤버 포인터 중 하나만 널 멤버 포인터 값인 경우, 두 포인터는 다름으로 비교됩니다.
  • 둘 중 하나가 가상 멤버 함수 를 가리키는 경우, 결과는 지정되지 않습니다.
  • 하나가 클래스 C1 의 멤버를 참조하고 다른 하나가 다른 클래스 C2 의 멤버를 참조하는 경우(둘 중 어느 것도 다른 클래스의 기본 클래스가 아닌 경우), 결과는 지정되지 않습니다.
  • 둘 다 동일한 union 의 (서로 다른) 멤버를 참조하는 경우, 두 포인터는 같음으로 비교됩니다.
  • 그렇지 않은 경우, 두 멤버 포인터는 연결된 클래스 타입의 가상 객체로 간접 참조를 수행할 경우 동일한 최종 파생 객체나 동일한 하위 객체의 동일한 멤버를 참조한다면 같음으로 비교되고, 그렇지 않으면 다름으로 비교됩니다.
struct P {};
struct Q : P { int x; };
struct R : P { int x; };
int P::*bx = (int(P::*)) &Q::x;
int P::*cx = (int(P::*)) &R::x;
bool b1 = (bx == cx); // 지정되지 않음
struct B
{
    int f();
};
struct L : B {};
struct R : B {};
struct D : L, R {};
int (B::*pb)() = &B::f;
int (L::*pl)() = pb;
int (R::*pr)() = pb;
int (D::*pdl)() = pl;
int (D::*pdr)() = pr;
bool x = (pdl == pdr); // false
bool y = (pb == pl);   // true

std::nullptr_t 타입의 두 피연산자 또는 std::nullptr_t 타입의 한 피연산자와 다른 null 포인터 상수는 동일함을 비교합니다.

(since C++11)

내장 포인터 관계 비교

관계 연산자 > , < , >= <= 의 변환된 피연산자는 포인터 타입을 가질 수도 있습니다.

서로 다른 포인터에 대한 내장 포인터 관계 비교 p q 는 세 가지 가능한 결과를 가집니다: p 가 더 큰 경우, q 가 더 큰 경우, 그리고 지정되지 않은 경우. 내장 포인터 관계 비교를 위한 관계 연산자가 반환하는 값은 아래에 나열되어 있습니다:

비교 결과
of p and q
반환 값
p > q p < q p >= q p <= q
같음 false false true true
p 가 더 큼 true false true false
q 가 더 큼 false true false true
지정되지 않음 지정되지 않은 bool

변환된 lhs rhs 가 모두 포인터인 경우, 포인터 변환 , 함수 포인터 변환 (C++17부터) 한정 변환 이 두 변환된 피연산자에 수행되어 복합 포인터 타입 으로 변환됩니다. 복합 포인터 타입의 두 포인터는 다음과 같이 비교됩니다:

  • 포인터들이 동일하게 비교되거나 동일성 비교 결과가 지정되지 않은 경우, 관계 비교 결과는 동일한 범주에 속합니다.
  • 그렇지 않은 경우(포인터들이 서로 다르게 비교되는 경우), 포인터 중 하나라도 객체에 대한 포인터가 아니면 결과는 지정되지 않습니다.
  • 그렇지 않은 경우(두 포인터 모두 객체를 가리키는 경우), 결과는 다음 규칙들과 일관된 부분 순서로 정의됩니다:
  • 배열의 두 개의 서로 다른 원소 high low 가 주어졌을 때, high 의 첨자가 low 의 첨자보다 높다면, 한 포인터가 high (또는 high 의 하위 객체)를 가리키고 다른 포인터가 low (또는 low 의 하위 객체)를 가리킬 때, 전자가 후자보다 비교 연산에서 더 크다고 판단됩니다.
  • 한 포인터가 배열의 원소 elem (또는 elem 의 하위 객체)를 가리키고 다른 포인터가 동일한 배열의 끝을 넘어선 위치(past-the-end)를 가리킬 때, 끝을 넘어선 포인터가 다른 포인터보다 비교 연산에서 더 크다고 판단됩니다.
  • 한 포인터가 완전한 객체, 기본 클래스 하위 객체 또는 멤버 하위 객체 obj (또는 obj 의 하위 객체)를 가리키고 다른 포인터가 obj 의 끝을 넘어선 위치를 가리킬 때, 끝을 넘어선 포인터가 다른 포인터보다 비교 연산에서 더 크다고 판단됩니다.

  • 포인터들이 서로 다른 non-zero-sized (since C++20) non-static data members with the same member access (until C++23) 를 가리키거나, 비-union 클래스 타입의 동일한 객체 내에서 이러한 멤버들의 하위 객체들을 재귀적으로 가리킬 경우, 나중에 선언된 멤버를 가리키는 포인터가 다른 포인터보다 크게 비교됩니다.
  • 그렇지 않은 경우, 결과는 지정되지 않습니다.

포인터 전체 순서

각 프로그램에는 구현에서 정의된 포인터에 대한 엄격한 전체 순서 가 존재합니다. 이 엄격한 전체 순서는 위에서 설명한 부분 순서와 일관됩니다: 지정되지 않은 결과는 구현에서 정의된 결과가 되며, 다른 결과는 동일하게 유지됩니다.

포인터 비교에 엄격한 전체 순서가 적용되는 경우는 다음과 같습니다:

(C++14부터)
(C++20부터)

오버로드

사용자 정의 연산자에 대한 오버로드 해결 에서, 열거형 타입을 포함한 모든 승격된 산술 타입 쌍 L R 에 대해, 다음 함수 시그니처들이 오버로드 해결에 참여합니다:

bool operator < ( L, R ) ;
bool operator > ( L, R ) ;
bool operator <= ( L, R ) ;
bool operator >= ( L, R ) ;
bool operator == ( L, R ) ;
bool operator ! = ( L, R ) ;
**참고:** 제공된 HTML 내용은 C++ 코드 조각으로, ` ` 태그 내에 포함되어 있어 번역에서 제외됩니다. 모든 HTML 태그와 속성, 그리고 C++ 관련 용어는 원본 그대로 유지되었습니다.

모든 객체 포인터 또는 함수 포인터 타입 P 에 대해, 다음 함수 시그니처들이 오버로드 해결에 참여합니다:

bool operator < ( P, P ) ;
bool operator > ( P, P ) ;
bool operator <= ( P, P ) ;
bool operator >= ( P, P ) ;
bool operator == ( P, P ) ;
bool operator ! = ( P, P ) ;
**참고:** 제공된 HTML 내용은 C++ 코드 조각으로, 모든 텍스트가 ` ` 태그 내에 포함되어 있어 번역에서 제외됩니다. 따라서 번역할 일반 텍스트가 없습니다. HTML 구조와 코드는 원본 그대로 유지됩니다.

모든 멤버 객체 포인터 또는 멤버 함수 포인터인 타입 MP 에 대해 또는 std::nullptr_t (C++11부터) , 다음 함수 시그니처들이 오버로드 해결에 참여합니다:

bool operator == ( MP, MP ) ;
bool operator ! = ( MP, MP ) ;
#include <iostream>
struct Foo
{
    int n1;
    int n2;
};
union Union
{
    int n;
    double d;
};
int main()
{
    std::cout << std::boolalpha;
    char a[4] = "abc";
    char* p1 = &a[1];
    char* p2 = &a[2];
    std::cout << "Pointers to array elements:\n"
              << "p1 == p2? " << (p1 == p2) << '\n'
              << "p1 <  p2? " << (p1 <  p2) << '\n';
    Foo f;
    int* p3 = &f.n1;
    int* p4 = &f.n2;
    std::cout << "Pointers to members of a class:\n"
              << "p3 == p4? " << (p3 == p4) << '\n'
              << "p3 <  p4? " << (p3 <  p4) << '\n';
    Union u;
    int* p5 = &u.n;
    double* p6 = &u.d;
    std::cout << "Pointers to members of a union:\n"
              << "p5 == (void*)p6? " << (p5 == (void*)p6) << '\n'
              << "p5 <  (void*)p6? " << (p5 <  (void*)p6) << '\n';
}

출력:

Pointers to array elements:
p1 == p2? false
p1 <  p2? true
Pointers to members of a class:
p3 == p4? false
p3 <  p4? true
Pointers to members of a union:
p5 == (void*)p6? true
p5 <  (void*)p6? false

3항 비교

3방향 비교 연산자 표현식의 형식은 다음과 같습니다

a <=> b

이 표현식은 다음과 같은 객체를 반환합니다

  • ( a <=> b ) < 0 만약 a < b 인 경우,
  • ( a <=> b ) > 0 만약 a > b 인 경우,
  • ( a <=> b ) == 0 만약 a b 가 같거나 동등한 경우.

피연산자 중 하나가 bool 타입이고 다른 피연산자가 그렇지 않을 경우, 프로그램은 형식에 맞지 않습니다.

두 피연산자가 모두 산술 타입을 가지거나, 한 피연산자가 비범위 열거형 타입을 가지고 다른 피연산자가 정수 타입을 가지면, 피연산자에 일반 산술 변환이 적용된 후

  • 축소 변환이 필요한 경우, 정수 타입에서 부동 소수점 타입으로의 변환을 제외하고 프로그램은 비정형입니다.
  • 그렇지 않고 피연산자가 정수 타입을 가지는 경우, 연산자는 std::strong_ordering 타입의 prvalue를 생성합니다:
  • std::strong_ordering::equal 두 피연산자가 산술적으로 같으면,
  • std::strong_ordering::less 첫 번째 피연산자가 두 번째 피연산자보다 산술적으로 작으면,
  • std::strong_ordering::greater 그 외의 경우.
  • 그렇지 않으면, 피연산자는 부동 소수점 타입을 가지며, 연산자는 std::partial_ordering 타입의 prvalue를 생성합니다. 표현식 a <=> b 는 다음을 생성합니다:
  • std::partial_ordering::less 만약 a b 보다 작으면,
  • std::partial_ordering::greater 만약 a b 보다 크면,
  • std::partial_ordering::equivalent 만약 a b 와 동등하면 ( - 0 <=> + 0 는 동등함),
  • std::partial_ordering::unordered ( NaN <=> anything 는 비정렬됨).

두 피연산자가 모두 동일한 열거형 타입 E 를 가질 경우, 이 연산자는 피연산자들을 E의 기반 타입으로 변환한 후 변환된 피연산자들에 <=> 를 적용한 결과를 반환합니다.

피연산자 중 적어도 하나가 객체 포인터 또는 멤버 포인터인 경우, 배열-포인터 변환 , 포인터 변환 한정 변환 이 양쪽 피연산자에 적용되어 복합 포인터 타입 으로 변환됩니다.

변환된 포인터 연산자 p q 에 대해, p <=> q std::strong_ordering 타입의 prvalue를 반환합니다:

  • std::strong_ordering::equal 만약 둘이 동등하게 비교되는 경우 ,
  • std::strong_ordering::less 만약 q 더 크게 비교되는 경우 p ,
  • std::strong_ordering::greater 만약 p 가 더 크게 비교되는 경우 q ,
  • 양방향 비교 결과가 지정되지 않은 경우 지정되지 않은 결과를 반환합니다.

그렇지 않으면, 프로그램은 형식이 잘못되었습니다.

오버로드

사용자 정의 연산자에 대한 오버로드 해결 에서 포인터나 열거형 타입 T 에 대해 다음 함수 시그니처가 오버로드 해결에 참여합니다:

R operator <=> ( T, T ) ;

여기서 R 은 위에서 정의된 순서 범주 타입입니다.

#include <compare>
#include <iostream>
int main()
{
    double foo = -0.0;
    double bar = 0.0;
    auto res = foo <=> bar;
    if (res < 0)
        std::cout << "-0 is less than 0";
    else if (res > 0)
        std::cout << "-0 is greater than 0";
    else if (res == 0)
        std::cout << "-0 and 0 are equal";
    else
        std::cout << "-0 and 0 are unordered";
}

출력:

-0 and 0 are equal
(C++20 이후)

참고 사항

비교 연산자는 왼쪽에서 오른쪽으로 그룹화되므로, 표현식 a < b < c ( a < b ) < c 로 파싱되며, a < ( b < c ) 또는 ( a < b ) && ( b < c ) 로 파싱되지 않습니다.

#include <iostream>
int main()
{
    int a = 3, b = 2, c = 1;
    std::cout << std::boolalpha
        << (a < b < c) << '\n' // true; 경고 발생 가능
        << ((a < b) < c) << '\n' // true
        << (a < (b < c)) << '\n' // false
        << ((a < b) && (b < c)) << '\n'; // false
}

사용자 정의 operator< 에 대한 일반적인 요구사항은 엄격한 약순서(strict weak ordering) 입니다. 특히, 이는 Compare 타입과 함께 동작하는 표준 알고리즘과 컨테이너들에 의해 요구됩니다: std::sort , std::max_element , std::map 등.

동일한 클래스의 서로 다른 비정적 데이터 멤버에 대한 포인터의 비교 결과 는 비정적 데이터 멤버들이 세 가지 멤버 접근 모드 각각에서 (C++23까지) 선언 순서대로 메모리에 배치됨을 의미합니다.

임의의 출처를 가진 포인터(예: 모두 동일한 배열의 멤버를 가리키지 않는 경우) 비교 결과는 명시되지 않았지만, 많은 구현체에서는 연속적인 가상 주소 공간 내의 주소로 구현된 경우와 같이 포인터의 엄격한 전체 순서 를 제공합니다. 이를 제공하지 않는 구현체(예: 포인터의 모든 비트가 메모리 주소의 일부가 아니어서 비교 시 무시해야 하거나 추가 계산이 필요하거나 포인터와 정수 간 1대1 관계가 아닌 경우)는 해당 보장을 갖는 포인터용 std::less 의 특수화를 제공합니다. 이를 통해 임의의 출처를 가진 모든 포인터를 std::set 이나 std::map 과 같은 표준 연관 컨테이너의 키로 사용할 수 있습니다.

EqualityComparable LessThanComparable 요구 사항을 모두 만족하는 타입에 대해, C++ 표준 라이브러리는 동등성(equality) 등가성(equivalence) 를 구분합니다. 동등성 은 표현식 a == b 의 값이며, 등가성 은 표현식 ! ( a < b ) && ! ( b < a ) 의 값입니다.

포인터와 널 포인터 상수 간의 비교는 CWG issue 583 의 해결안이 N3624 에 포함되면서 제거되었습니다:

void f(char* p)
{
    if (p > 0) { /*...*/ } // N3624 이후 오류, N3624 이전에는 컴파일됨
    if (p > nullptr) { /*...*/ } // N3624 이후 오류, N3624 이전에는 컴파일됨
}
int main() {}

삼중 비교는 클래스 타입에 대해 자동으로 생성될 수 있습니다. 자세한 내용은 기본 비교 를 참조하십시오.

두 피연산자가 모두 배열인 경우, 삼중 비교는 형성되지 않습니다.

unsigned int i = 1;
auto r = -1 < i;    // 기존 함정: 'false'를 반환함
auto r2 = -1 <=> i; // 오류: 축소 변환이 필요함
기능 테스트 매크로 표준 기능
__cpp_impl_three_way_comparison 201907L (C++20) 3-way 비교 (컴파일러 지원)
__cpp_lib_three_way_comparison 201907L (C++20) 3-way 비교 (라이브러리 지원); 라이브러리에 3-way 비교 추가

표준 라이브러리

비교 연산자는 표준 라이브러리의 많은 클래스에 대해 오버로드됩니다.

(C++20에서 제거됨)
객체가 동일한 타입을 참조하는지 확인합니다
( std::type_info 의 public member function)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20)
error_code 를 비교
(함수)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20)
error_condition error_code 를 비교합니다
(함수)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
pair 내의 값들을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
튜플의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨)
내용 비교
( std::bitset<N> 의 public member function)
(C++20에서 제거됨)
두 할당자 인스턴스를 비교함
( std::allocator<T> 의 public member function)
다른 unique_ptr 또는 nullptr 와 비교
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
다른 shared_ptr 또는 nullptr 와 비교
(함수 템플릿)
(C++20에서 제거됨)
std::function nullptr 와 비교
(함수 템플릿)
(C++11) (C++11) (removed in C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
두 duration을 비교함
(함수 템플릿)
(C++11) (C++11) (C++20에서 제거됨) (C++11) (C++11) (C++11) (C++11) (C++20)
두 시간 점 비교
(함수 템플릿)
(C++20에서 제거됨)
두 개의 scoped_allocator_adaptor 객체를 비교
(함수 템플릿)
기본 std::type_index 객체들을 비교함
( std::type_index 의 public 멤버 함수)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
두 문자열을 사전순으로 비교
(함수 템플릿)
(C++20에서 제거됨)
로케일 객체 간의 동등성 비교
( std::locale 의 public 멤버 함수)
(C++11) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++20)
array 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
deque 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++11) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++11) (C++20에서 제거됨) (C++20)
forward_list 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
list 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
vector 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
map 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
multimap 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
set 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
multiset 의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++11) (C++11) (removed in C++20)
unordered_map의 값을 비교합니다
(함수 템플릿)
(C++11) (C++11) (removed in C++20)
unordered_multimap 내의 값을 비교합니다
(함수 템플릿)
(C++11) (C++11) (removed in C++20)
unordered_set의 값을 비교합니다
(함수 템플릿)
(C++11) (C++11) (removed in C++20)
unordered_multiset의 값을 비교합니다
(함수 템플릿)
queue 의 값을 사전식으로 비교합니다
(함수 템플릿)
stack 의 값을 사전식으로 비교합니다
(함수 템플릿)
기본 반복자를 비교합니다
(함수 템플릿)
(C++11) (C++11) (C++20에서 제거됨) (C++11) (C++11) (C++11) (C++11) (C++20)
기본 반복자를 비교함
(함수 템플릿)
(C++20에서 제거됨)
istream_iterator 를 비교함
(함수 템플릿)
(C++20에서 제거됨)
istreambuf_iterator 를 비교함
(함수 템플릿)
(removed in C++20)
두 복소수 또는 복소수와 스칼라 값을 비교합니다
(함수 템플릿)
두 valarray를 비교하거나 valarray와 값을 비교합니다
(함수 템플릿)
(C++11) (C++11) (C++20에서 제거됨)
두 의사 난수 엔진의 내부 상태를 비교함
(함수)
(C++11) (C++11) (C++20에서 제거됨)
두 분포 객체를 비교함
(함수)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
sub_match 를 다른 sub_match , 문자열 또는 문자와 비교합니다
(함수 템플릿)
(C++20에서 제거됨)
두 매치 결과의 값을 사전식으로 비교합니다
(함수 템플릿)
(C++20에서 제거됨)
regex_iterator 를 비교함
( std::regex_iterator<BidirIt,CharT,Traits> 의 public 멤버 함수)
(C++20에서 제거됨)
regex_token_iterator 를 비교함
( std::regex_token_iterator<BidirIt,CharT,Traits> 의 public 멤버 함수)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
thread::id 객체를 비교합니다
(함수)

네임스페이스 std::rel_ops 는 일반적인 연산자 ! = , > , <= , 그리고 >= 를 제공합니다:

헤더 파일에 정의됨 <utility>
네임스페이스에 정의됨 std::rel_ops
(C++20에서 사용 중단됨)
사용자 정의 operator == operator < 를 기반으로 비교 연산자를 자동 생성
(함수 템플릿)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 583
( N3624 )
C++98 여섯 가지 비교 연산자를 모두 사용하여
포인터와 널 포인터 상수를 비교할 수 있었음
동등성 연산자만
허용됨
CWG 661 C++98 산술 비교의 실제 의미(예:
1 < 2 true 또는 false 를 반환하는지 여부)가 명시되지 않았음
명세가 추가됨
CWG 879 C++98 함수 타입에 대한 포인터와
void 에 대한 포인터에 내장 비교가 없었음
이러한 포인터에 대한 비교
명세가 추가됨
CWG 1596 C++98 비배열 객체는 포인터 산술 연산을 목적으로만
하나의 요소를 가진 배열에 속하는 것으로 간주되었음
해당 규칙이 비교에도
적용됨
CWG 1598 C++98 서로 다르고 어느 쪽도 다른 쪽의 기본 클래스가 아닌 클래스의
멤버에 대한 두 포인터는 가리키는 멤버의 오프셋이 동일할 수 있더라도
동등하게 비교되지 않았음
이 경우 결과가
명시되지 않음
CWG 1858 C++98 동일한 union의 서로 다른 멤버를 참조하는
두 멤버 포인터가 동일한 멤버를 참조하는 것처럼
동등하게 비교되는지 여부가 명확하지 않았음
이 경우 동등하게
비교됨
CWG 2419 C++98 비배열 객체에 대한 포인터는
포인터가 & 로 얻어진 경우에만
크기 1의 배열의 첫 번째 요소에 대한 포인터로 취급되었음
모든 비배열 객체에 대한
포인터에 적용됨
CWG 2526 C++98 void 및 함수 포인터의 관계 비교( > , >= , < , <= ) 정의가
N3624 에 의해 제거되었음
복원됨
CWG 2796 C++17 내장 포인터 관계 비교 시 변환된 포인터 피연산자에
함수 포인터 변환이 수행되지 않았음
이 경우 이러한
변환을 수행함

참고 항목

일반 연산자
assignment increment
decrement
arithmetic logical comparison member
access
other

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

함수 호출

a ( ... )
콤마

a, b
조건부 연산자

a ? b : c
특수 연산자

static_cast 관련된 타입 간 변환을 수행
dynamic_cast 상속 계층 구조 내에서 변환을 수행
const_cast cv -한정자를 추가하거나 제거
reinterpret_cast 관련 없는 타입 간 변환을 수행
C-style cast static_cast , const_cast , 그리고 reinterpret_cast 의 혼합으로 타입 변환을 수행
new 동적 저장 기간을 가진 객체를 생성
delete new 표현식으로 생성된 객체를 파괴하고 획득한 메모리 영역을 해제
sizeof 타입의 크기를 조회
sizeof... pack 의 크기를 조회 (C++11부터)
typeid 타입의 타입 정보를 조회
noexcept 표현식이 예외를 발생시킬 수 있는지 확인 (C++11부터)
alignof 타입의 정렬 요구사항을 조회 (C++11부터)

C 문서 for Comparison operators