Closed tshino closed 1 year ago
規格の調べ方に慣れていないので確信はないですが、
C++20からあるstd::shift_left
の方は負数を指定可能だったようですが、
C++23で追加されたstd::ranges::shift_left
では負数はpreconditionで除外されている、という違いがあるようです。
ご指摘は正しそうです。
どうやら、C++20の非Rangeアルゴリズムの頃から、std::shift_left
/std::shift_right
ともに事前条件としてn >= 0 is true
が指定されてします。
C++23のRangeアルゴリズム版もそれを引き継いでいるようです。
確認ありがとうございます!
気になっていたのは std::shift_left
のページで参考リンクにある P0769R2 では事前条件の記載がなく、If n <= 0 or n >= last - first, does nothing.
となっていたことでした。
ですが、C++20の参照する規格案となっているN4861を見ると事前条件の記載があることが分かりました。
確認が取れたので、以下の4ページについて修正すれば良さそうですね。
std::shift_left
std::shift_right
std::ranges::shift_left
std::ranges::shift_right
修正内容:
n <= 0
である場合何もしない」を「 n == 0
である場合何もしない」 に修正気になっていたのは
std::shift_left
のページで参考リンクにある P0769R2 では事前条件の記載がなく、If n <= 0 or n >= last - first, does nothing. となっていたことでした。
経緯を調べてみたところ、P1243R4 Rangify New Algorithms にて "Preconditions: n >= 0 is true." が追加されていました。
N4859 Editors' Report -- Programming Languages -- C++ によれば、NBコメント US 318 への対応とのことです。
LWG poll 22: P1243R4 "Rangify new algorithms", resolving 3 NB comments:
- NB FR 305: Add more range-enabled algorithms
- NB US 307: Add more range-enabled algorithms
- NB US 318: Handle negative shift counts
そうすると、std::shift_left
とstd::shift_right
の参照の欄にP1243R4も追加した方が良さそうでしょうか?
@tshino さん:そうですね。参照リストに P1243R4 Rangify New Algorithms も追加しておくとよさそうです。
細かいことで恐縮ですが、若干不正確な説明を見つけたので指摘させてください。
std::ranges::shift_left
では事前条件がn >= 0
となっていますが、備考蘭でと書かれているため、負数を指定可能のような誤解を与えそうです。 この場合負数はundefined behaviorとなるはずなので、
のような記載が望ましいと思われます。 https://github.com/cpprefjp/site/blob/master/reference/algorithm/ranges_shift_left.md