Redeclaration of explicitly defaulted comparison operator makes it undefined

  Kiến thức lập trình

In the following program, struct A has default friend equality comparison operator, which is redeclared again to get the pointer of the function (&operator==):

struct A {
    friend constexpr bool operator ==(const A &, const A &) noexcept = default;
};

static_assert( A{} == A{} ); //if this line is removed the program fails
constexpr bool operator ==(const A &, const A &) noexcept;
static_assert( (&operator==)( A{}, A{} ) );

All major compilers (GCC, Clang, MSVC) are fine with the program. Online demo: https://gcc.godbolt.org/z/dhcd8esKn

However if the line with static_assert( A{} == A{} ); is removed, then the same compilers start rejecting the program with the errors:

error: ‘constexpr bool operator==(const A&, const A&)’ used before its definition

note: undefined function ‘operator==’ cannot be used in a constant

note: failure was caused by call of undefined function or one not declared ‘constexpr’

Could you please explain why above program is valid only in presence of static_assert( A{} == A{} ); before operator== redeclaration?

Theme wordpress giá rẻ Theme wordpress giá rẻ Thiết kế website

LEAVE A COMMENT