Skip to content

Clarify wording of [class.eq] #6036

@leni536

Description

@leni536

Background

[class.eq] currently reads:

The return value V of a defaulted == operator function with parameters x and y is determined by comparing corresponding elements $x_i$ and $y_i$ in the expanded lists of subobjects for x and y (in increasing index order) until the first index $i$ where $x_i == y_i$ yields a result value which, when contextually converted to bool, yields false.
If no such index exists, V is true.
Otherwise, V is false.

The first long sentence describes the side effects of calling a defaulted operator==, while the other two sentences describe the return value.

This is unambiguous, but I think the wording could be improved.

Problem

At first glance this might be interpreted in a way that describes three distinct cases. In that case it's hard to make sense of the "Otherwise, V is false." sentence, as seemingly the previous sentences cover all cases.

This came up on the std-discussion mailing list: https://lists.isocpp.org/std-discussion/2022/12/1927.php

Some proposals for rewording

  1. Mirror the wording of [class.spaceship]:

...when contextually converted to bool, yields false;
V is false.
If no such index exists, V is true.

  1. Switch around the last two sentences:

..when contextually converted to bool, yields false.
If such index exists, V is false.
Otherwise, V is true.

Some other considerations

Even though the first long sentence describes the side effects of calling a defaulted operator==, it leads in with "The return value V of a defaulted == operator function with parameters x and y is determined...". It might be better to reword the first sentence in a way that doesn't mention the return value yet. One such wording would be, combined with the second suggestion above:

When a defaulted == operator function is called with parameters x and y then the corresponding elemnts $x_i$ and $y_i$ in the expanded lists of subobjects for x and y (in increasing index order) are compared until the first index $i$ where $x_i == y_i$ yields a result value which, when contextually converted to bool, yields false.
If such index exists, the return value is false.
Otherwise, the return value is true.

[class.spaceship] can have similar treatment.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions