cpprefjp / site

cpprefjpサイトのMarkdownソース
https://cpprefjp.github.io/
375 stars 155 forks source link

shift_leftにシフト数として負数を指定可能と読める記述 #1132

Closed tshino closed 1 year ago

tshino commented 1 year ago

細かいことで恐縮ですが、若干不正確な説明を見つけたので指摘させてください。

std::ranges::shift_left では事前条件が n >= 0 となっていますが、備考蘭で

シフト数として負数を指定するとなにも起こらないが、

と書かれているため、負数を指定可能のような誤解を与えそうです。 この場合負数はundefined behaviorとなるはずなので、

シフト数として負数を指定することはできないが、

のような記載が望ましいと思われます。 https://github.com/cpprefjp/site/blob/master/reference/algorithm/ranges_shift_left.md

tshino commented 1 year ago

規格の調べ方に慣れていないので確信はないですが、 C++20からあるstd::shift_leftの方は負数を指定可能だったようですが、 C++23で追加されたstd::ranges::shift_leftでは負数はpreconditionで除外されている、という違いがあるようです。

onihusube commented 1 year ago

ご指摘は正しそうです。

どうやら、C++20の非Rangeアルゴリズムの頃から、std::shift_left/std::shift_rightともに事前条件としてn >= 0 is trueが指定されてします。

C++23のRangeアルゴリズム版もそれを引き継いでいるようです。

tshino commented 1 year ago

確認ありがとうございます!

気になっていたのは std::shift_left のページで参考リンクにある P0769R2 では事前条件の記載がなく、If n <= 0 or n >= last - first, does nothing. となっていたことでした。 ですが、C++20の参照する規格案となっているN4861を見ると事前条件の記載があることが分かりました。

確認が取れたので、以下の4ページについて修正すれば良さそうですね。

修正内容:

yohhoy commented 1 year ago

気になっていたのは 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
tshino commented 1 year ago

そうすると、std::shift_leftstd::shift_rightの参照の欄にP1243R4も追加した方が良さそうでしょうか?

yohhoy commented 1 year ago

@tshino さん:そうですね。参照リストに P1243R4 Rangify New Algorithms も追加しておくとよさそうです。