2732. Questionable specification of path::operator/= and path::append

Section: 31.12.6.5.3 [fs.path.append] Status: C++17 Submitter: Tim Song Opened: 2016-06-14 Last modified: 2017-07-30

Priority: 2

View all other issues in [fs.path.append].

View all issues with C++17 status.

Discussion:

The current specification of operator/= taking a const Source& parameter, and of path::append in 31.12.6.5.3 [fs.path.append] appears to require Source to have a native() and an empty() member, and seemingly requires different behavior for append(empty_range) and append(first, last) when first == last (the last two bullet points being specified with source alone), which doesn't make any sense.

It appears that these overloads can just be specified using the operator/=(const path&) overload.

[2016-07-03, Daniel comments]

The same wording area is affected by LWG 2664.

[2016-08 Chicago]

Wed AM: Move to Tentatively Ready

Friday AM, in discussing 2664 a comment about missing "equivalent to" language was made, so PR updated.

Previous Resolution [SUPERSEDED]

This wording is relative to N4594.

  1. Edit 31.12.6.5.3 [fs.path.append]/4-5 as indicated:

    template <class Source>
      path& operator/=(const Source& source);
    template <class Source>
      path& append(const Source& source);
    

    -?- Effects: operator/=(path(source))

    -?- Returns: *this.

    template <class InputIterator>
      path& append(InputIterator first, InputIterator last);
    

    -4- Effects: Appends path::preferred_separator to pathname, converting format and encoding if required (31.12.6.3 [fs.path.cvt]), unless:

    • an added directory-separator would be redundant, or

    • an added directory-separator would change an relative path to an absolute path, or

    • source.empty() is true, or

    • *source.native().cbegin() is a directory-separator.

    Then appends the effective range of source (31.12.6.4 [fs.path.req]) or the range [first, last) to pathname, converting format and encoding if required (31.12.6.3 [fs.path.cvt])operator/=(path(first, last)).

    -5- Returns: *this.

Proposed resolution:

This wording is relative to N4606.

  1. Edit 31.12.6.5.3 [fs.path.append]/4-5 as indicated:

    template <class Source>
      path& operator/=(const Source& source);
    template <class Source>
      path& append(const Source& source);
    

    -?- Effects: Equivalent to return operator/=(path(source));.

    template <class InputIterator>
      path& append(InputIterator first, InputIterator last);
    

    -4- Effects: Equivalent to return operator/=(path(first, last));.Appends path::preferred_separator to pathname, converting format and encoding if required (31.12.6.3 [fs.path.cvt]), unless:

    1. — an added directory-separator would be redundant, or
    2. — an added directory-separator would change an relative path to an absolute path, or
    3. source.empty() is true, or
    4. *source.native().cbegin() is a directory-separator.

    Then appends the effective range of source (31.12.6.4 [fs.path.req]) or the range [first, last) to pathname, converting format and encoding if required (31.12.6.3 [fs.path.cvt]).

    -5- Returns: *this.