ExerciseC++読書会 vol.5
#ExerciseC++
https://scrapbox.io/files/6983353470707df9ae4835e5.png
開催日時
2026年4月28日(火) 19:30~21:00
開催URL
https://cpp-osaka.connpass.com/event/390132/
参加人数
5人
ウォーミングアップ
パズル11
code: cpp
"Bound reference 1\n";
"Freed memory area 2"
"Bound reference 2\n";
"Freed memory area 3"
"Bound reference 3\n";
"Freed memory area 3"
"Freed memory area 1"
// ↑間違い
生存期間の話
getMemory(3)の時の怪しげな動きに対してregisterを付けるとスコープ延長できるような提案がなされている。
ライムタイム #typo
const auto &reference2 = getMemory(2).number_;
これもちゃんとライフタイムが延長するんだ
code: cpp
for ( init-statement
for-range-declaration : for-range-initializer ) statement
// これは以下に等しい
{
init-statement
auto &&range = for-range-initializer ;
auto begin = begin-expr ;
auto end = end-expr ;
for ( ; begin != end; ++begin ) {
for-range-declaration = * begin ;
statement
}
}
関連する問題
rangeが参照で受け取っている部分なので延命されるはずなのにC++23までは延命されなかった。
規格、コンパイラ、ツールに目を光らせる。多くの場合、バグ
はコンパイラや言語自体で修正される。
ここの「バグ」は規格の抜け穴みたいな意味
横着せずにローカル変数をきちんと定義する
C++20から入ったrangesを使うとローカル変数を使わないことが多いのでこのケースに、はまりやすい
https://cpprefjp.github.io/reference/ranges.html
パズル12
code: cpp
"Machine stopped"
"Engine stopped"
// ↑間違い
マシンは止まらないんだ
コンストラクタ中で例外が出ていてそもそも始まってないので
もしエンジンのコンストラクタで例外が出た場合は?
すでに構築済みのメンバ変数に対してはデストラクタが実行される
まだ構築していない変数に関してはデストラクタは実行されない
scope_exit
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4189.pdf
C++14から提案されているがまだ標準化入りされていない
_の多重定義が許されるようになったのでこちらの議論が進展するかも
パズル13
次回ここから
お悩み雑談室