This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++17 status.

### 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`.