ExerciseC++読書会 vol.9
#ExerciseC++
https://scrapbox.io/files/6983353470707df9ae4835e5.png
開催日時
2026年6月30日(火) 19:30~21:00
開催URL
https://cpp-osaka.connpass.com/event/396345/
参加人数
4人
ウォーミングアップ
パズル18
解答
未定義動作?
↓
有効だが未規定の状態
未規定とか未定義動作とか
https://cpprefjp.github.io/implementation-compliance.html
エラー性動作
https://cpprefjp.github.io/lang/cpp26/erroneous_behavior_for_uninitialized_reads.html
なんでunsigned charの値読み取りはエラー性動作ではないの?
どうしてOSを変えてテストしたの?
コンパイラごとで確認しないと意味がないような
std::stringのSSOが効いている場合でもmoveしたら空文字列になる?
わざわざコピー元を初期化する?
空文字1文字代入するだけ
むしろlengthに0を入れるだけ
c_str()を呼び出さない限り空文字はわざわざ入れない
std::stringの不変条件ってなに?
null終端で終わること
c_str()を呼び出さなくても空文字を追加するのがC++11から定められている
他にもある
moveされたオブジェクトへのアクセスってもっと未定義動作寄りかと思ってた
パズル19
2 + (-2) + (-3) = -3
ひっかけのひっかけ
v.size()が初期値になっているのもひっかけ
違う部分がひっかけだった
これはaccumulate()の作りが悪いでしょ
https://cpprefjp.github.io/reference/numeric/accumulate.html
なんでinitの型で行こうとするのか
InputIteratorのvalue_typeを参照してほしい
intからunsigned intへの変換では、valueが負の場合(このパズルではそうなる)、ラップアラウンドが発生する可能性がある。
符号なしの加算では、結果が大きすぎる場合(このパズルではそうならない)、ラップアラウンドが発生する可能性がある。
このパズルの例ではラップアラウンド発生しているのでは?
どちらも「ラップアラウンドが発生する可能性がある」と言っている
文章的に対比が取れていない気がする
どっちにせよ発生するのか
まだ読んでる?
わざとやってる・・・?
ここまですべて未定義動作ではない
今だとラップアラウンドが保証されていていいね
昔のコンパイラだと-2がunsigned intで0にクランプされるような挙動のものがあった
では、何かできる?
accumulate()を書き換える
InputIteratorのvalue_typeを参照してほしい、って言ったけどそれだとより広い型を器として用意するすべがなくなってしまうので書き換えなくてもいいのかも
恣意的なコード例だったよね
ひっかけさせたい
パズル20
次回ここから
お悩み雑談室
「元も子もない」よりも「身もふたもない」の方が正しい言い回し
「元も子もない」
元金も利息もない。すべてを失って何もない。
「身もふたもない」
入れ物(器)もふたもなく、中身だけがむきだしになっている意
はっきりし過ぎている。あからさまである。あまりに直接的で、含みも情味もない
https://zenn.dev/parmaski/articles/3d28db71b524fd