ポインタ操作では、以下のように「間接参照可能か(有効な値を指すポインタか)」をチェックしてから間接参照する、というのがよく行われます。
if (p) {
T x = *p;
}
これを以下のように書けるようにしよう、というのがこの提案。
if (T x : p) {
}
つまり、間接参照ができるなら間接参照をして値を取り出す、までを一つのif
文でやってしまおうというものです。
これは、値の判定と取り出しを同時に行う、ミニマムなパターンマッチと見なすことができます。
この機能は、多くの状況で便利に活用できます。
weak_ptrの場合
weak_ptr
は、lock()
メンバ関数を使用してshared_ptr
オブジェクトを取り出します。その際、以下のようなコードを書くことになりますが、
if (shared_ptr<T> sp = wp.lock()) {
f(*sp);
}
この状況で欲しいのはshared_ptr
オブジェクトではなく、それを間接参照した要素ですので、今回提案されている構文を使えば、このようなコードがより簡潔に書けるようになります:
if (T& x : wp.lock()) {
f(x);
}
while文の場合
有効な値を取り出せる間ループし続ける、という以下のようなコードも、
while (optional<message> m = try_read(i)) {
process(*m);
}
この提案の構文をwhile
文にも適用すれば、以下のように書けるようになります。
while (message m : try_read(i)) {
process(m);
}
optional
は間接参照の演算子を持っているので、この構文が適用可能です。
この提案の今後
この提案の作者が、Clangで試しに実装してみるようです。今回の提案はだいぶ小さなものですが、非常に有用なものだと感じます。