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.
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.
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:
-?- Returns:operator/=(path(source))
*this
.template <class InputIterator> path& append(InputIterator first, InputIterator last);-4- Effects:
Appendspath::preferred_separator
topathname
, 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()
istrue
, or
*source.native().cbegin()
is a directory-separator.-5- Returns:
Then appends the effective range ofsource
(31.12.6.4 [fs.path.req]) or the range[first, last)
topathname
, converting format and encoding if required (31.12.6.3 [fs.path.cvt])operator/=(path(first, last))
.*this
.
Proposed resolution:
This wording is relative to N4606.
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));
.Appendspath::preferred_separator
topathname
, 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()
istrue
, or—*source.native().cbegin()
is a directory-separator.
Then appends the effective range ofsource
(31.12.6.4 [fs.path.req]) or the range[first, last)
topathname
, converting format and encoding if required (31.12.6.3 [fs.path.cvt]).
-5- Returns:*this
.